有人说,Kotlin 即将取代 Java。十几年来,很多编程语言都想取代 Java,但它依然屹立在浪潮之巅,凭啥这次是 Kotlin 呢?和 Java 相比它有哪些优势?谷歌为什么钦点它作为 Android 官方编程语言?想解开这些问题,这个回答会带你去源头看一看。
相信不少人应该听说了,谷歌宣布 Kotlin 是 Android 应用程序开发人员的首选语言。前几天,谷歌又一次重申了对 Kotlin 的承诺,同时表示在 2020 年,将努力提供更多的 Kotlin + Android 学习资料,并与 Kotlin 的开发公司 JetBrains 合作改善代码编译器,加快代码的编译速度。
近几年,Kotlin 的热度持续走高,再加上谷歌大力扶持,使得它获得了越来越多开发者的青睐。谷歌宣称,目前在前 1000 个 Android 应用程序中,包含 Kotlin 代码的达到了 60%,使用 Kotlin 的开发人员数量也一直在稳定增长。
此前,Java 在 Android 编程江湖中占据了绝对统治地位,Android 的发展也离不开 Java 的贡献。在谷歌宣布引入 Kotlin 后,这两门编程语言之间的竞争逐渐进入白热化阶段,Pinterest、Uber 等顶级科技公司甚至已经将他们的 Android APP 编程语言从 Java 转换成了 Kotlin。ThoughtWorks 首席技术官丽贝卡·帕森斯(Rebecca Parsons)非常看好 Kotlin,“那些尚未了解 Kotlin 的开发人员最好看看它能够做些什么。Kotlin 绝对是一门真正优秀的编程语言,它具有扎实的特性和不断发展的生态系统”。
Kotlin 是一门静态类型、面向对象的编程语言,依托 JVM,为 Android、浏览器和本地解决方案而设计。2011 年,捷克的 JetBrains 软件公司正式发布 Kotlin,JetBrains 在程序员群体中可谓大名鼎鼎,该公司最为人熟知的产品就是 Java 语言开发集成环境 IntelliJ IDEA。
Kotlin 核心开发者斯维特拉娜·伊凡诺沃(Svetlana Isakova)在接受采访时说,这门编程语言在诞生之初就是为了解决 Java 存在的问题,比如语法冗长以及 Java 空指针的问题。另一名核心开发者安德烈·布雷斯拉夫(Andrey Breslav)一出手就是要取代 Java,人家是这么说的:“创建一门与 Java 100% 兼容,但比 Java 更安全、更简洁、更灵活,并且不会过于复杂的语言”。
使用 Java 编程的工程师看到这里是不是已经吓哭了?别紧张,取代一门老牌语言没那么容易,毕竟最大的语言生态在那里摆着。我们继续说 Kotlin。
技术更新换代,新的编程语言层出不穷,但像 Kotlin 这样诞生没几年就获得技术巨头支持的却少之又少,Go 语言算一个,Kotlin 算一个。早在 2017 年,谷歌就宣布要好好支持这门编程语言,不知道 JetBrains 和谷歌是不是打招呼了。随后,Kotlin 又因为跨平台特性和相关工具的崛起,成功在 Thoughtworks 的技术雷达上亮相,后来还成为了 Stack Overflow 上最受欢迎的语言之一。在国内发展也不慢,像字节跳动这样的头部企业,也开始在 Android 开发工程师招聘需求里提到“熟悉 Kotlin 者优先”。
Kotlin Multiplaform是一个相当庞大的内容,包含Android、IOS、macOS、Window等多系统,JS、Java、ObjC、Python等多个技术栈。目前整体上还处于试验阶段,但Android/IOS领域是Kotlin团队的首要落地场景,提供了很多的支持,已具备可用性。针对常用的工具库也有相关的跨平台支持:stdlib、io、serialization\序列化、coroutines\并发、ktor\网络、SQLDelight\数据库。
Kotlin跨平台不是抽取平台公有的api再封装起来,而是让开发者在共享代码的同时又可以随意访问平台相关的api。为了实现这一点,需要一套类似声明/定义的机制,也需要隔离不同平台的代码。
种种迹象表明,Kotlin 发展势头凶猛,甚至要成为 Java 势均力敌的竞争者。这两门编程语言也经常被拿来作比较,虽然开发人员对二者的看法褒贬不一,但对于 Kotlin 语言层面的优势,大家还是有共识的:
Kotlin 汲取了许多编程语言的精髓,它的语法不像 Java 那么复杂,学习成本更低,调试程序花费的时间也更少;
Kotlin 支持显式地声明 null,并确保开发人员不会遇到可能导致质量问题的空引用异常;
Kotlin 支持线程的并发协同,当取消一个线程执行的时候,并不会阻塞任何其他线程,Java 虽然也允许多线程在后台运行,但它的处理机制更加复杂,在处理长时间运行的网络 I/O 或 CPU 密集型任务方面,Kotlin 比 Java 更具有领先优势;
Kotlin 允许开发人员在不使用冗余类的情况下定义函数和静态对象,轻松地在代码中同一个地方完成对象和函数的定义,这会让代码更容易阅读和调试;
Kotlin 得到了 Android Studio 的有效支持,Java 7 虽然也得到了全部支持,但 Java 8 只得到了部分功能支持;
Kotlin 的生产效率更高,谷歌对它的支持也更好,如果你的项目只针对 Android 开发,不需要创建更大规模、更复杂的产品的话,可以果断选择 Kotlin;
Kotlin 支持内联函数,使用 Lambda 表达式时,这些内联函数让它比 Java 编写的代码运行得更快;
Kotlin 的发展速度更快,它由 Kotlin 基金会管理,并由编程语言设计大师安德烈·布雷斯拉夫(Andrey Breslav)特意设计,可以快速进化。
虽然优点很多,但 Kotlin 还处于不断成长和进化中,并不完美。目前,它还不支持很多功能,比如静态成员、通配符类型、非私有字段、Checked Exception、原始类型以及三元运算符等等。
一边是稳健老练的 Java,一边是新生代 Kotlin,为什么谷歌钦点后者作为 Android 官方编程语言?谷歌产品管理总监斯蒂芬妮·卡特伯森(Stephanie Cuthbertson)给出了五个理由:
在我看来,Kotlin 对 Java 开发者最大的改变不是减少浪费在写代码上的时间,而是一系列思维方式的转变:
与其让开发者手动控制循环,不如把循环封装在类库内部,类 C 语言的三段式 for 循环和 while 循环简直是 bug 和复杂代码的元凶;
面向对象,但不能被类和对象捆住手脚,把函数解放出来!
每一行代码都要用在刀刃上,尽量减少模板代码和多余的声明;
编程语言要设计好“默认配置”,引导开发者多使用“默认配置”,比如类默认不可继承、访问控制符默认 public、集合默认只读、类型默认不为 null 等等;
不变对象优于可变对象,多用 val 少用 var、多用只读集合少用可变集合、多用非空类型少用可空类型;
类要“回归本心”,只承担“抽象对象”的功能,Kotlin 鼓励多使用扩展、少在类里塞一堆 API 和实现,尽量采用“类基本框架 + 外部扩展功能函数”的模式。
其实最根本的原因大家都心知肚明:Kotlin 不是 Oracle 的,毕竟谷歌和 Oracle 这两家巨头之间的版权战打了十年之久。从 Go 语言到 Dart,再到支持 Kotlin,谷歌在编程语言上的探索从未停止脚步。
不论如何,Kotlin 的确是一门优秀的编程语言,但要在 Android 编程上完全取代 Java,还是有很长的路要走。