用于 Android 开发的 Kotlin:是重量级语言还是毫无意义的炒作?

更新时间:2017-06-27 13:55:00 点击次数:1852次

在 2017 Google I/O 大会的 Keynote 演讲中,我们了解到,Kotlin 编程语言将在 Android 上正式受到官方支持。消息一出,世界各地开发人员纷纷击掌欢呼——很多人认为 Java 即将会被取而代之(老实说,我依然是 Java 的爱好者)。


对 Kotlin 的炒作是否合情合理呢?其实这也相当于 Swift 语言的发展,令人兴奋的同时也有因这门语言并不成熟,所以很多开发者并没有使用它。


两年前我曾发誓倘若 Google 不支持它,我也不会开始认真学习 Kotlin。既然现在已经做了支持,那么我也有理由继续深入学习。


为了能快速学习这门新语言,我基于已有的开发技能并利用熟悉的语言(Java 和 Scala)来学习 Kotlin。


印象


当阅读 Kotlin 文档时,我注意到的个地方是它能编译字节码、JavaScript、Native、而且它是由 Jetbrains 开发的。下面让我们一起来攻克这门语言吧。


如果 Kotlin 编译为字节码,则意味着它在运行时使用 JVM(Java虚拟机)将字节码编译为机器码。


那么 JavaScript 呢? 事实上,它使用目标 ECMAScript 5.1 将 Kotlin 代码转换为 JavaScript。 虽然我不是 JavaScript 专家,但是可以查看官方文档以获取更多详细信息。


Kotlin 的一个厉害的特性在于能够编译原生,并支持更多没有 JVM 的平台 - 现在,Kotlin Native 可以在 Mac OS、Linux、Raspberry Pi 和 iOS(通过在 Mac 上交叉编译)上使用 LLVM 生成可执行文件。 Windows 平台尚不支持,但他们正在开发中。


我梦想的场景是:用 Kotlin Native 开发 Android 和 iOS 应用程序的所有业务逻辑,然后用特定平台语言(Android = Java / Kotlin,iOS = Objective-C / Swift)开发 UI。 Kotlin Native 仍然未成熟,所以在它成熟之前我必须等。


另一个人们比较关注重视的问题:


Kotlin 与 Java 能 100% 兼容吗?


查看官网就能知道答案:



这就是我此刻的反应:



但在我们真正深入了解这个特性之前,还有更多的细节值得我们去探索。


如果阅读过关于 Kotlin 的文章,也会了解到它的特性:



下面我们详细分析一下这些特点。


不变性


与具有功能编程概念的所有语言一样,不可变性是主要的讨论要点之一。 那么在 Kotlin 中它是如何工作?


变量可以是:



关键字 val 真的不可变吗?


不。当定义真正不可变的变量时,我们总是需要检查它是否满足两种不可变:




那么 Kotlin 有不可变的 collection 吗?


是的,它的确有。


你可以在不可变的 collection、map、set 等之间进行选择,因为该语言具有两种实现。如下所示:



代码量比 Java 少


Kotlin 有只保存数据的数据类,所以写所有 POJO 类可以用一种简洁的方式。


Java 代码:



Kotlin 代码:



好的,此刻你肯定在想:为什么你使用 var(可变的)而不使用 val(不可变的)呢?



这是因为 Java 中 Foo 类从一开始就设置为可变。


在 Kotlin 扩展中可以找到另一种编写较少代码的方法。其允许你在不修改源代码的情况下向类中添加方法/函数——告别使用 Utils 类。 Kotlin 团队已经使用了扩展的 JDK 类,如文件、IO 和线程。


以下是标准库的示例:



空指针安全性


如果使用 Java 开发,那么在某些情况下,必须处理NPE(Null Pointer Exception),当忘记检查变量是否为 null 或者你没有预料到会有一个空值变量时,它会弹出 NPE。


Kotlin 对此有一个聪明的解决方法:默认情况下使所有类型不可为空。因此,编译器不会让你使用未初始化或不可空变量。但是通过运算符“?”你仍然可以使用可空类型。


以下是几个案例:



你可能会认为,不可为空的类型并不总是会被使用,因为有时它不在控制范围内,例如网络响应问题。


别担心,Kotlin 包含一个“Elvis 操作符”,通过这个简单的操作符“?”就可以表达典型的 if else null :



所以告别 if else 表达式。



后一个关键是,你可以像 “?”一样使用 “!!” 操作符。它们区别在哪里?如果变量为 null,它将抛出一个NullPointerException,所以请避免使用它!



Java 互操作性


这个话题对我来说特别重要,因为我所有在 Android 及后端开发中都是用 Java 编写的。我也为此感到骄傲,所以我现在不想改变他们。


如前面所述,Kotlin 与 Java 是 100% 兼容的。


以下是使用 GSON 和 Retrofit 的一些示例:



在 Mobile Jazz,我们开发了 Bugfender 作为 iOS 和 Android 应用程序的远程日志记录服务。 Android SDK 完全由 Java 开发。 Kotlin 同样可以开发——它可以在 Kotlin Android 应用程序中使用,因为与 Java 可互操作。点击这里查看一个例子。


本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是一个个人学习交流的平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽,造成漏登,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

回到顶部
嘿,我来帮您!