这是我参与「第四届青训营」笔记创作活动的第 2 天。
在这次组队大项目中,我初次了解到了 Kotlin 这门新兴语言。为了能使本项目顺利开展,我也对这门语言进行了一定的学习。接下来我将会写一些我对这门语言的理解。
方法
方法相当于函数,本章均用方法代替函数。
Java
Java 的方法都比较普通,和其他语言相比,算是没有什么亮点的一种,它可以简单的分为静态方法和非静态方法,比如:
// 静态方法
public static void foo() {
doSomething();
}
// 非静态方法
public void bar() {
doSomething();
}
Java 的方法规定必须在类里,不能脱离类来使用。而且,Java 不支持很多特性,导致有时候不能很优雅的进行一些行为。
比如说,你要实现 dp 与 px 的转换,通常会写出这样的方法:
public class Utils {
public static int dp2px(int dp) {
return px;
}
}
当你有一个 dp 值(= 114514)时,你会写出这样的代码实现转换:
Utils.dp2px(114514)
虽然说这样做没有任何错误,但看起来总是觉得不美观,要是直接114514.dp
能实现转换就好了,可惜 Java 暂时不支持拓展函数的写法。你无法拓展 Integer 的方法,对于 Java 来说,它就是定死的。
再比如说,我们都知道在 Java 里,Array 和 List 有一个很大的区别就是在获取元素的时候前者用[]
,后者用get(int)
。很多人刚学 Java 的时候都会有这样的疑问,为什么不统一起来都是[]
呢?很大一个原因就是 Java 不支持运算符重载,Java 无法把get(int)
识别成类似 Array 的 []
。还有就是 BigInteger 那个算大数的类,加减乘除必须用链式调用方法,而不能和一般数字一样使用符号,这也是不能运算符重载造成的问题。
除此之外,Java 还有很多不是很尽善尽美的地方。
Kotlin
Kotlin 相比 Java 那可是玩得花了。Java 有的它都有,没有的它也有。
接下来我会写一个集大成的 kt 文件,再写一个由该 kt 文件反编译后的 Java 文件,来介绍一下 kotlin 的各种方法。
fun a(): Int {
return 1
}
class Test {
companion object {
fun b(): Int {
return 1
}
@JvmStatic
fun c(): Int {
return 1
}
}
fun d(): Int {
return 1
}
operator fun plus(test: Test): Test {
return Test()
}
}
你一看,我 static 呢,怎么没了?怎么类外面还会有方法?别急,看看这个代码对应的 Java 代码:
public class Test {
public static final Test.Companion Companion = new Test.Companion(null);
@JvmStatic
public final static int c() {
return 1;
}
public final int d() {
return 1;
}
public final Test plus(@NotNull Test test) {
Intrinsics.checkNotNullParameter(test, "test");
return new Test();
}
public static final class Companion {
public final int b() {
return 1;
}
@JvmStatic
public final int c() {
return 1;
}
private Companion() {
}
// $FF: synthetic method
public Companion(DefaultConstructorMarker $constructor_marker) {
this();
}
}
}
public class TestKt {
public final static int a() {
return 1;
}
}
它们的区别在反编译文件中写的很详细。那个plus
方法就是运算符重载,你就可以用符号来代替链式调用了。
总结
相比 Java,Kotlin 明显有更大的灵活性。值得 Android 开发者进行深入学习。