过去一年,使用 Kotlin 来为安卓开发的人越来越多。即使那些现在还没有使用这个语言的开发者,也会对这个语言的精髓产生共鸣,它给现在 Java 开发增加了简单并且强大的范式。Jake Wharton 在他的 Øredev 的讨论中,提到了 Kotlin 是如何通过提升安卓开发的语言特性和设计模式来解决这些严重的问题,通过这些方法你可以清除那些无用的 API 还有无效代码。充分利用扩展特性来解决你的开发中的模板性代码的问题!
为什么要推广这个语言?
好吧,大伙。欢迎来到这里。我们今天的主题是使用 Kotlin 语言的高级安卓开发 – 推广我们开发应用的语言。首先呢,我们需要弄清楚我们为什么要在安卓开发中更进一步?为什么我们需要一些新的东西来推进安卓开发?
许多人都会提到的一个经典的原因就是我们现在被 Java 6-ish 困住了,Java 7 也差不多是同样的状况。这被称作是一片荒地。
javax.time 是 Java 8 才引进的新库, JSR310。这个库我们在安卓上没有,所以我们被老的日期和日历的 API 困住了,它们都非常容易出错。
Java 8 的另外一个功能 streams,安卓也没有。我们还缺少其他的语言特性,比如 lambdas,method references 和 不引用 outer class 的 anonymous classes。最后,我们没有 try-with-resources。Try-with-resources 不在 Java 7 里面,而安卓在 API 19 中大部分都是 Java 7, 在 API 20 中又增加了点,但不是全部。所以只有当你的定义最小的 SDK 的时候,你才能用这些相关的功能。
Java 6 不是个问题
尽管上面4个问题都看起来十分令人头疼,但是事实上它们不是。关于 javax.time,为 Java 8 SDK 编写的大部分代码大部分都能够以 ThreeTenBP 的形式向后兼容 Java 6,所以你可以这样使用。
关于 streams,Java 6 上也有一个向后兼容的移植或者一个常用的 Java 库,RxJava 实现了同样的概念,只不过用了一种略微不同的有争议性的更强大的方式。
也有一个工具叫做 Retrolambda,它事实上也可以运行 Java 8 bytecode 并且向后兼容了 lambdas 和 method references 到 Java 6。
最后,如我所说,如果你的最小的 SDK 是 19 的话,你可以使用 try-with-resources,而且 Retrolambda 也会允许你这样做。
这些关于 Java 6 是个问题的争论都有工具去解决它们。当然,如果我们能使用 Java 8 是最好的,但是这些替代方案都是经过实战测试而且能够很好地工作的方案。所以上面的理由就不太算数了。无论如何,有两个方面我想重点讨论一下,因为这两个方面没有类似的解决方案。
Java 语言的限制和问题
Java 语言的一些限制和所带来的一些问题,这些问题 Java 语言本身是不可避免的。例如,我们不能给不是我们自己写的 types、classes 或者 interfaces 增加新的方法。长时间以来,我们都会采用 util 类,杂乱无章地堆砌着我们代码或者或者揉在同一个 util package 里面。如果这是解决方案的话,它肯定不理想。
Java 语言的类型系统都有 null 的问题,在 Android 上更为明显。因为它没有对可能是或不是 null 的类型完成 first-class representation。所以,被称作 “billion dollar mistake” 的 null 指针异常最后会毁了你的应用。
接下来, Java 肯定不是最简洁的语言。这件事本身不是件坏事,但是事实上存在太多的常见的冗余。这会带来潜在的错误和缺陷。在这之前,我们还要处理安卓 API 带来的问题。
Android API 的设计问题
安卓是一个庞大的继承系统;他们为他们的继承系统而感到自豪,对他们来说这个系统工作的也非常的正常,但是这个系统倾向于把问题推向应用开发者。而且,空引用的问题也回来了,这个问题在安卓系统中十分明显,因为他们想让系统更加有效些。null 被用在许多地方来代表值的缺失,而不是封装成更高级的类型,比如一个类型或者可选项。
同时,回到语言的冗余,安卓的 API 有着自己许多的范式。这也许是因为性能的原因。设计者们最后写出的这些 APIs 需要你,开发者,来做许多的事情来提高效率而不是用其他的方法抽象它们。