我们在《2018 编程语言流行度大调查》中谈到,在用户最喜爱和最关注的编程语言中,Java独领风骚。其中,Java 9关注度不断上升,62% 的人希望在 2018 年更多地关注 Java 9,此外有三分之一的参与者表示对即将到来的Java 10 和 11版本很感兴趣。
在过去的一年中Java经历了一段时间的动荡,今年Java又有什么新进展呢?本文让我们一起来看看Java的状况吧。
以下为译文:
2017年是Java界最动荡的一年。期待已久的Java 9带来了许多的变化和有趣的新功能,同时Oracle也宣布了JDK最新的发布时间表。而这一切只是个开始。过去开发人员常常抱怨Java的发展速度不够快。我认为这些抱怨将在不久的将来消失,甚至有可能带来意外的惊喜。
从2018年开始,JDK建立了全新的发布时间表。以前一次大的版本升级需要等好几年,现在则缩短为每隔6个月发布一次小版本。继2017年9月Java 9发布之后,Java 10将在2018年3月发布,以及之后更多的新版本都将很快到来。
企业技术栈概览
大多数企业项目不仅使用JDK,还依赖一系列的企业级函数库,如Spring Boot、Java EE等,而这些函数库也将在接下来几个月中得到升级。我将在本文中重点讨论JDK,但是首先让我们来看看Java界中两个主要的企业技术栈将有哪些变化。
Spring开发团队正在努力开发Spring Boot 2,并在今年1月份发布了第一个RC版本。该团队并没有在API方面做出重大的变化,也不打算在最终版本发布之前添加任何新功能。所以,如果你的项目中用到了Spring Boot,那么最好现在仔细研究新版本,并开始计划现有Spring Boot应用程序的更新。
在2017年年底,Oracle将Java EE标准移交给了由Eclipse基金会管理的EE4J项目。正如大家所料,移交这样的一个大项目不可能在几天内完成,其中有很多组织和技术方面的工作需要完成。Java EE需要一个新名字并建立全新的开发流程。另一方面,保存在各种bug跟踪工具中的源代码和二进制文件的移交仍在进行中。开发者还需要等待很长一段时间,才能看到此次移交带来的效果,以及更强大的社区参与。
缩短JDK的发布和支持周期
Oracle去年宣布将在2018年内发布两个新的JDK版本。以往Oracle一贯秉承缓慢的版本发布节奏,每隔几年才发布一个主版本,其中包含大量的变化,从今年起将改为每6个月发布一个较小的版本。这一变化可以加速Java平台的创新,还可以降低Java更新带来的风险。而Java开发人员可以更加容易地熟悉小版本的最新变化,并将其应用到项目中。
我认为这对Java界是个非常积极的改变,它将为Java语言的开发增添新动力,JDK团队也可以更快地适应和创新。
JDK 10带来的变化和新功能
由于发布周期较短,Java 10只包含少量的变化。请参照OpenJDK网站公布的有关JDK 10的最新消息(http://openjdk.java.net/projects/jdk/10/),其中包含12个JEP(JDK Enhancement Proposal,JDK改进提案)。
其中最值得一提的变化是局部变量的类型推断(JEP 286,http://openjdk.java.net/jeps/286)。其次你应该了解下新增的基于时间的版本命名方式(JEP 322,http://openjdk.java.net/jeps/322),以及G1(或称Garbage First垃圾收集器)开始支持并行Full GC(JEP 307,http://openjdk.java.net/jeps/307)。
类型推断
JDK 10终于引入了类型推断。许多其他静态类型语言很早就已经支持这个功能了,众多Java开发人员一直希望引入这项功能。
JEP 286引入了关键字var,简化了局部变量的声明,并由编译器根据初始化代码推断变量的类型。以往我们必须写:
List<String> paramNames = List.of("host.name", "host.port"); Configuration config = initializeConfig(paramNames);
现在可以简化为:
var paramNames = List.of("host.name", "host.port"); var config = initializeConfig(paramNames);
以上代码中,关键字var替代了冗长的变量声明。这可以增加代码的阅读性,特别在代码有合理的变量命名规则,并且变量仅在声明后使用几次的情况下尤为明显。
如果想更深入地了解JEP 286以及使用方法,可以参照Nicolai Parlog的这篇文章:https://blog.codefx.org/java/java-10-var-type-inference/。
基于时间的版本命名方式
从Java 10开始,Java的版本号格式将发生变化,以更好地支持基于时间的发布方式。
新的发布方式带来的最大难点在于:版本的实际内容可能发生变化。由于开始时唯一可以确定的只有新版本的发布时间,所以如果新功能的开发时间比预期长,无法在新版本发布时完成,就不能进入新版本。因此版本号需要以时间点为准,而非版本内包含的变更内容。
JEP 322定义的版本号格式为:$ 功能号.$ 临时号.$ 更新号.$ 补丁号,具体使用方法如下:
开发团队将在每6个月发布一个新功能版本,并将版本号的“$ 功能号”加1。
2018年3月发布的版本为JDK 10,那么9月份的新版本就是JDK 11。开发团队在JEP 223中表示,他们希望每次新功能发布可以至少包含一到两个重要功能。
“$ 临时号”可以灵活使用,目前以6个月为期的发布方式中并没有用到此项,所以到目前为止,这个数字始终是0。
开发团队还将在功能发布之间穿插小的升级,这种升级不会包含不兼容的改动。他们可以在功能发布后的1个月或3个月,发布一次小的升级,届时可以将“$ 更新号”加1。
G1的并行Full GC
对于大多数开发者来说,这只是个很小的变化。有的应用程序甚至都不会注意到这个变化。
JDK 9中G1成了默认的垃圾回收器。G1的设计目的旨在避免全面的垃圾回收,但是并不代表这种现象永远不会发生。不幸的是,G1在执行全面回收时仅使用了单线程的“标记-清理-压缩”算法,与之前的并行回收器相比这可能导致性能的下降。
JEP 307实现了这一算法的多线程版,从而解决了该问题。从JDK 10开始,它将使用与Young GC和Mixed GC同样多的线程数。
因此,如果应用程序需要强制垃圾回收器执行全面的回收,那么JDK 10可以提高效率。
有关JDK 11的计划
JDK 10还没有正式发布,而距离JDK 11的发布只有7个月了。所以,其开发团队已经制定了几个JEP的计划,请参照2018年第二次新功能发布的信息:http://openjdk.java.net/projects/jdk/11/。
除了删除废弃的Java EE和CORBA模型(JEP 320)、以及引入新的垃圾回收器(JEP 318)之外,JDK 11还有可能引入动态的类文件常量(JEP 309),以及在隐含类型的匿名表达式中支持关键字var(JEP 323)。
JDK 11目前的范围体现了缩短发布周期所带来的优势,JEP 309和310引入了新功能,而其他两个JEP则负责通过迭代方法改进已有功能。
2017年9月JDK 9发布的时候,Java EE和CORBA模块就被废弃了。一年以后,随着JDK 11的发布,JEP 320将把它们从JDK中删除。所以它们不会在Java中逗留太久,很快就要计划删除了。
继JEP 286在JDK 10中引入局部变量的类型推断后,JEP 323将进一步提升这一功能。将来我们可以看到更多关于这方面的改进。发布周期缩短后,团队可以分步在一次或多次功能发布中完成一个大功能,从而降低发布的难度。
缩短支持周期需要快速适应
Oracle在推出新的发布方式的同时,也改变了他们的支持方式。这个新的方式对短期发布和长期发布的支持所有不同。
短期发布(如Java 9和10等),相关的面向公众的支持会在下个版本发布时终止。因此Java 9的支持将于2018年3月停止,而2018年9月后Java 10也无法再获得支持。
Java 11是一次长期发布。Oracle对这类发布的支持期限更长,但是到目前为止,他们还没有宣布对Java 11的支持会持续到什么时候。
应用程序开发者需要决定是否要每6个月更新一次Java版本,还是选择多等几年使用长期的发布版本。另外,Oracle鼓励所有人使用Java SE的高级产品,它们的每个长期发布版都包含至少5年的支持。
总结
过去,大量开发者抱怨Java的升级太慢,2018年后这种情况将有所改善。全新的、6个月为期的发布周期和相应的支持模型,可以加速已有应用程序的升级,并定期引入新功能。加上Java EE和Spring等已有框架的提升,Java界内将出现全新的活力。另一方面,那些若干年才更新一次应用程序的各大公司要做好心理准备哦。
原文:The State of Java in 2018: Faster Updates and New Features
链接:https://dzone.com/articles/the-state-of-java-in-2018-faster-updates-and-new-features
译者:马晶慧
责编:言则