作者 | 施尧
近几年由于谷歌力推以及其自身的优良特性,Kotlin 获得越来越多开发者的青睐,如今已成为 StackOverFlow 上最受欢迎的编程语言之一,成为 Java 最直接的竞争对手。
美国当地时间 9 月 14 日,编程语言 Java 发布了 Java 开发工具 JDK 最新版 JDK 17。据了解,此次发布的 JDK 17 是一个 LTS(长期支持)版本,这类 JDK 的特性是生态对其支持的时间将长达八年,也就意味着 JDK 17 的支持将扩展到 2030 年。
通常情况下,Java 在每年 3 月和 9 月发布新版本,也即每六个月发布一次。根据 Oracle Java SE 支持生命周期 的政策,普通版的 JDK 支持时长为六个月,下一个版本出现时即过期。因此,如果有长期使用的需求,一般推荐采用 LTS 版本。
与 JDK 17 对应,前溯 LTS 版本的 JDK 分别为 Java 11 和 Java 8,二者的支持分别扩展到 2026 年 9 月和 2030 年 12 月,均适合长期使用。
1 Java 17 的新变化
版本更新必然有功能更新,让我们一起看看 Java 17 都有哪些变化。
首当其冲的必定是密封类,密封类限制了其允许被继承的子类,先前的 Java 15 中有过首次预览,在这次 Java 17 中正式发布。实际使用时,密封类有一个 permit 子句,用于指定允许的子类,如下所示:
publicabstractsealedclassShapepermitsCircle, Rectangle, Square { ... }
除此外,Java 17 改进了对本地 macOS 的支持,包括使用 macOS Metal 的 Java 2D 新渲染管道,以及到 AArch64 (Apple Silicon) 的端口。同时,该版本还为一个新的随机数生成器提供了增强的特性,例如更好的随机化算法。
增加新特性的同时,也移除了一些已有的特性,其中最值得说的是 Applet API。“这可以追溯到 Java 的最初阶段,”Azul Systems 副首席技术官 Simon Ritter 在 Java 17 的新闻圆桌会议上说。“Applet 真的快要淘汰了。Applet 浏览器插件在 JDK 11 中已经被删除了...... 他们已经决定真正摆脱 Applet API。在 Java 17 中它已被弃用。”
同时还删除了实验性的 Java 提前 (AOT) 编译器,SDK 文档中提到“该编译器自引入以来几乎没有使用,然而维护它所需的工作却很繁重” 并且“这些功能未包含在 Oracle 先前发布的 JDK 16 版本里,也没有人抱怨。” 相对应的是,HotSpot Just-in-time 编译器依然存在,想要使用 AOT 编译的人可以指向 Graal。
除了上述主要特性调整外,还包括“结束了绕过访问内部 API 块的简单方法”,“具有模式匹配的增强型 switch 语句”,“外函数和内存 API”。感兴趣的读者可自行到 Java 17 的 JDK 文档查阅细节。
2 Java VS Kotlin
Kotlin 是在 GitHub 上公开开发的,主要由 JetBrains(流行的 IDE IntelliJ IDEA 的制造商)开发,但谷歌也有贡献。IntelliJ IDEA 是谷歌 Android Studio IDE 的基础,用于构建 Android 应用程序。
近几年由于谷歌力推以及其自身的优良特性,Kotlin 获得越来越多开发者的青睐,如今已成为 StackOverFlow 上最受欢迎的编程语言之一,成为 Java 最直接的竞争对手。
这次 Java 17 发布,业界也有声音提到“Java 是否落后于 Kotlin”?对此,JCP(Java 社区进程)执行委员会成员兼 JetBrains 的首席开发人员倡导者 Trisha Gee 说到“Java 开发人员在 Kotlin 中看到了他们在 Java 中想要的东西,而来自 Kotlin 世界的声音则认为如果 JVM 或 Java 支持某些东西会很好...... 因此,两个社区确实有争议,但我认为这是积极的争议,就像“编程语言良性的军备竞赛”。同时,从 Oracle 的角度来看,向后兼容一直是最重要的事情。”
那么 Java 与 Kotlin 相比,到底孰优孰劣?下面为大家做个简单的对比:
Kotlin 哪里优于 Java?
开发人员对 Kotlin 和 Java 的看法褒贬不一。但是,在为什么选用 Kotlin 而不是 Java 作为编程语言这一点上,他们却有一些共识:
  • 声明数据类型的代码通常又累赘又乏味,但是 Kotlin 给出了一种在代码运行时作出主动类型推断的解决方案。通过查看代码的其余部分以及使用数据的方式,Kotlin 让开发人员明白,这个函数正在使用什么数据类型。它有效地避免了开发人员在代码中不必要地声明表达式和数值的类型。
  • 我们都知道,一个人需要多年时间才能做到精通 Java 及其语法。相反地,Kotlin 却不需要这么久。Kotlin 的语法不像 Java 那么复杂。用 Kotlin 编写代码比 Java 简单。因为 Kotlin 吸取了之前存在的众多编程语言中的精髓。使用这样的编程语言,最终让阅读和理解代码也变得很简单,调试程序花费的时间也更少。
  • Kotlin 允许开发人员在不使用冗余类的情况下定义函数和静态对象。开发人员可以轻松地在代码中同一个地方完成对象和函数的定义。这会让代码更容易阅读和调试。
最后,用 Kotlin 编写的代码比 Java 更友好、更快捷、更容易。
Kotlin 与 Java 的比较  
现在您已经了解了什么是 Kotlin,让我们从各个功能方面来比较 Kotlin 和 Java 的差异。
流行程度
当 Google 在 2016 年发布第一个稳定版本时,Kotlin 的市场份额在 2017 年 5 月增长到了 4.28%。到 2017 年 9 月,这一比例升至 7.54%。
而 2018 年的一项对 10 万 stack overflow 用户的调查显示,超过 7.54% 的受访者使用 Kotlin 进行 Android 开发。可以访问 Kotlin 的状态报告看看它现在的发展状况。
而 Java 语言的普及程度仍然处于巅峰转台。最新的证据是 Java 的 TIOBE 指数,这足以证明截至 2019 年 6 月,Java 仍然是全球最流行的 Android 编程语言。
Android Studio 支持
说到 Java, Android 并不支持所有的 Java 功能。虽然 Android 完全支持 Java 7,但 Android 只支持 Java 8 所有特性中的一部分。
然而,已证实的是,Kotlin 在 Android Studio 中得到了更有效的支持。因此,如果想要支持编程语言的全部功能,你可以放心地选用 Kotlin。如果您计划在未来构建多个 APP,Kotlin 是一个完美的选择。
处理“Null”的能力
当您使用 Java 时,您可以将“Null”分配给任何变量。当您使用带有 null 值的对象引用时,会遇到一个麻烦,因为会得到一个“NullPointerException”异常。
在 Kotlin,这是它最大的优势之一。在 Kotlin 中,没有“数据类型”可以将 null 作为默认值。如果开发人员希望在“可设定为无效的(nullable)”变量中保留 null 值,则必须显式地去定义它。这样就从根本上消除了“NullPointerException”。
处理长时间运行的网络 I/O 或 CPU 密集型任务
Java 允许多线程在后台运行,但是它的处理机制很复杂,在单独一个线程中实现长时间运行的 I/O 或 CPU 密集型操作的功能。
而在 Kotlin 中,开发人员可以运行多个线程。它支持线程的并发协同。这些机制在一定程度上使得取消一个线程执行的时候,并不会阻塞任何其他线程。
因此,在处理长时间运行的网络 I/O 或 CPU 密集型任务方面,Kotlin 比 Java 更具有领先优势。
开发人员成本
2018 年底,Kotlin 编程是最受欢迎、最赚钱的技能之一。Kotlin 开发人员的平均年薪约为 14 万美元。
随着 Android APP 需求的增长,对精通 Kotlin 编程的开发人员的需求也在增加。因此,你应该放长眼光未雨绸缪地让自己的技能做好准备。
相比之下,Java 开发人员的雇佣成本在招聘 Kotlin 的雇佣方那里是可以承受的。因为市场上实在是有太多 Java 开发人员,你完全可以根据自己的项目需求在招聘中讨价还价。
构建更复杂的产品
如果您的目标是创建更大规模更复杂的产品,那么 Java 仍然是更好的选择,而且由于 Java 比 Kotlin 更成熟,Java 本身的特性更支持构建大规模软件。
另一方面,如果主要目标只是 Android 开发,那么你的首选编程语言一定是 Kotlin,因为 Kotlin 生产效率更高,Google 对其支持更好。
性能和编译速度
JetBrains 公司声称 Kotlin 的性能比 Java 好是因为它的速度。Kotlin 支持内联函数,使用 lambda 代码时,这些内联函数让 Kotlin 比 Java 编写的代码运行得更快。
此外,Java 编译干净版本的速度比 Java 要快 10-15%。然而,在编译方面,Kotlin 和 Java 结果相近,或者 Kotlin 稍好一点。
Java 在哪些方面仍然保持其领先地位?
Kotlin 可能是新鲜事物,并且迅速地受到开发人员青睐,但是除了编程语言成熟度之外,Java 和 Kotlin 相比仍然有一些优势。而且,许多开发人员仍然更喜欢使用 Java 来进行 Android 开发。
Kotlin 中不支持下列功能:
  • 静态成员
  • 通配符类型
  • 非私有字段
  • 已检查的异常
  • 原始类型
  • 三元运算符 a?b: c
看完对比之后,相信读者对 Java 和 Kotlin 孰优孰劣已经有了自己的判断。编程语言之于开发者,就好比兵器之于武将。江湖兵器千百种,没有绝对的好坏之分,习武之人只有结合自己的实际需求选择最适合自己的兵器,才能做到事半功倍,与手中良器相得益彰;对于开发者,又何尝不是呢。
今日推荐文章
服务器端编程语言报告出炉,PHP 独占鳌头十几年

QCon 全球软件开发大会上海站设置【解析性能优化】专题,邀请字节跳动、阿里巴巴、Arm、华为、Intel、腾讯等技术团队性能优化相关领域一线技术专家,分享性能优化面临的问题及解决方案。点击底部【阅读原文】查看专题详情。
9 折优惠即将结束,扫码下图二维码咨询入场门票。
继续阅读
阅读原文