写在前面
去年,哦不,前年五月的时候,谷歌宣布了Kotlin-First 这一重要概念,主张Kotlin 是 Android 开发者的首选语言。
消息发出去后,很多人心中都有了一个疑问:那我一个搞Android开发的,我现在是不是以后就只用学Kotlin 就可以了?
一般有这个疑问或者想法的人都是外行人或者说是入行不久的人。
今天在这里就分享一个行业大佬的看法吧,本文也可以当做移动开发新手手册。希望本文对大家有帮助。
来自公众号:承香墨影
本文内容:
- Kotlin可能带来的坑
- 分析总结
- 移动开发学习
Kotlin可能带来的坑
一. 前言
新语言有新特性,开发者还保持 Java 的编程习惯去写 Kotlin,也不是不行,但是总感觉差点意思。
最近公众号「谷歌开发者」连载了一个《实用 Kotlin 构建 Android 应用 | Kotlin 迁移指南》的系列文章,就举例了一些 Kotlin 编码的小技巧。
既然是一种指南性质的文章,自然在「多而广」的基础上,有意去省略一些细节,同时举例的场景,可能还有一些不恰当的地方。
这里我就来补齐这些细节,今天聊聊利用 Kotlin 的方法默认参数的特性,完成类似 Java 的方法重载的效果。完全解析这个特性的使用方式和原理,以及在使用过程中的一个深坑。
二. Kotlin 的简易方法重载
2.1 Kotlin 如何简化方法重载?
在 Java 中,我们可以在同一个类中,定义多个同名的方法,只需要保证每个方法具有不同的参数类型或参数个数,这就是 Java 的
方法重载
。
class Hello {
public static void hello() {
System.out.println("Hello, world!");
}
public static void hello(String name) {
System.out.println("Hello, "+ name +"!");
}
public static void hello(String name, int age) {
if (age > 0) {
System.out.println("Hello, "+ name + "(" +age +")!");
} else {
System.out.println("Hello, "+ name +"!");
}
}
}
在这个例子中,我们定义了三个同名的
hello()
方法,具有不同的逻辑细节。
在 Kotlin 中,因为它支持在同一个方法里,通过 「
?
」标出可空参数,以及通过「
=
」给出参数的默认值。那这三个方法就可以在 Kotlin 中,被柔和成一个方法。
object HelloDemo{
fun hello(name: String = "world", age: Int = 0) {
if (age > 0) {
System.out.println("Hello, ${name}(${age})!");
} else {
System.out.println("Hello, ${name}!");
}
}
}
在 Kotlin 类中调用,和前面 Java 实现的效果是一致的。
HelloDemo.hello()
HelloDemo.hello("承香墨影")
HelloDemo.hello("承香墨影", 16)
但是这个通过 Kotlin 方法参数默认值的特性申明的方法,在 Java 类中使用时,就有些区别了。因为 HelloDemo 类被声明为 object,所以在 Java 中需要使用
INSTANCE
来调用它的方法。
HelloDemo.INSTANCE.hello("承香墨影",16);
Kotlin 中调用
hello()
方法很方便,可以选择性的忽略参数,但是在 Java 中使用,必须全量的显式的去做参数赋值。
这就是使用了参数默认值的方法申明时,分别在 Kotlin 和 Java 中的使用方式,接下来我们看看原理。
2.2 Kotlin 方法参数指定默认值的原理
Kotlin 编写的代码,之所以可以在 Java 系的虚拟机中运行,主要是因为它在编译的过程中,会被编译成虚拟机可识别的 Java 字节码。所以我们通过两次转换的方式(Show Kotlin Bytecode + Decompile),就可以得到 Kotlin 生成的对应 Java 代码了。