Java开发的项目如何转为Kotlin

659 阅读3分钟

在Android开发中,一种是用Java语言开发,另一种是用Kotlin语言开发,甚至还可以Java和Kotlin语言混合开发。无论你现在使用哪一种语言开发Android,Kotlin成为Android的主流编程语言都是大势所趋。既然你改变不了环境,那就适应环境好了。

使用Kotlin开发的优缺点

优点:

  1. 语法简洁,灵活,支持高阶函数和协程等Java不具有的优势
  2. 强制编译时空类型检查,对稳定性提升有一定作用
  3. 别人的Java代码可以一键转换为Kotlin,而Kotlin转换为Java则相对更麻烦

缺点:

  1. 学习门槛更高,学习Kotlin要先会Java,因为很多类库都是Java的
  2. 很多开源库还都是Java的,编译出的字节码版本可能会不一样,可能导致打断点失效

如何转换

截屏2023-06-04 18.50.08.png

选择要替换的文件或目录,然后菜单栏依次"Code" -> "Convert Java File to Kotlin File",或者使用快捷键。这里就牵扯到转换粒度的问题,可以整个项目的src一起转,也可以按包的目录转,也可以一个文件一个文件转,按文件内容转这里就不考虑了,只要把Java代码复制进kt的文件中,Android Studio就会自动提示是否转换为Kotlin。我个人的建议是按包目录转,因为你可能会遇到一些问题,然后方便回滚代码。除非非常有经验,可以整个项目一起转了再修复问题。

转换可能会出现的问题

Android Studio的这个一键转换功能,并不能保证完全没有语法错误,所以还需要我们开发人员去修复小的语法问题。

  • is开头的方法,一律去掉括号直接转为属性

  • get开头的方法,一律去掉get,然后首个单词首字母转为小写且去掉括号转为属性

  • List一律换成MutableList

  • public关键字一律去掉,因为kotlin默认就是public的

  • Map的key泛型一律去掉?,而value也建议去掉?

  • override方法划红线的尝试重写一个,然后把代码移进去

  • 数组的.get(i)修改为[i]

  • ArrayList和MutableList的泛型去掉?

  • emptyList()修改为arrayListOf

  • 必要时修改Array为MutableList 截屏2023-06-03 下午3.20.42.png

  • 调用方法时,对象可能为null的,可以先用!!.调,除非明确知道这个属性要判空,则先判空

  • 能Convert to lambda建议转lambda表达式

  • 基本数据类型错误直接修改即可

    截屏2023-06-03 下午3.43.22.png

  • 给Parcelable的CREATOR加上@JvmField @JvmField val CREATOR: Parcelable.Creator<SavedState>

  • Map的keySet()方法修改为keys属性,entrySet()修改为entries属性

override val keys: MutableSet<String>
    get() = Sets.filter<String>(super.keys) { key: String? -> key != null

override val entries: MutableSet<MutableMap.MutableEntry<String, MutableList<String>>>
    get() = Sets.filter<MutableMap.MutableEntry<String, MutableList<String>>>(
    super.entries as Set<MutableMap.MutableEntry<String, MutableList<String>>>?
    ) { 
        entry: Map.Entry<String, MutableList<String>> -> entry.key != null 
    }

以上为常见的一些问题,主要还是要对kotlin的语法比较熟悉,转换过来才能得心应手,否则即使换成了kotlin,写起代码来也比较难受。换完后一定要严格的测试一下,以保证业务功能没有问题。不要为了提升代码稳定性反而弄巧成拙就不好了。