在Android开发中,一种是用Java语言开发,另一种是用Kotlin语言开发,甚至还可以Java和Kotlin语言混合开发。无论你现在使用哪一种语言开发Android,Kotlin成为Android的主流编程语言都是大势所趋。既然你改变不了环境,那就适应环境好了。
使用Kotlin开发的优缺点
优点:
- 语法简洁,灵活,支持高阶函数和协程等Java不具有的优势
- 强制编译时空类型检查,对稳定性提升有一定作用
- 别人的Java代码可以一键转换为Kotlin,而Kotlin转换为Java则相对更麻烦
缺点:
- 学习门槛更高,学习Kotlin要先会Java,因为很多类库都是Java的
- 很多开源库还都是Java的,编译出的字节码版本可能会不一样,可能导致打断点失效
如何转换
选择要替换的文件或目录,然后菜单栏依次"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
-
调用方法时,对象可能为null的,可以先用!!.调,除非明确知道这个属性要判空,则先判空
-
能Convert to lambda建议转lambda表达式
-
基本数据类型错误直接修改即可
-
给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,写起代码来也比较难受。换完后一定要严格的测试一下,以保证业务功能没有问题。不要为了提升代码稳定性反而弄巧成拙就不好了。