炼数成金 门户 大数据 Java 查看内容

动荡的 Java 今年将有哪些新变化?

2018-3-2 10:51| 发布者: 炼数成金_小数| 查看: 11174| 评论: 0|原作者: Thorben Janssen|来自: CSDN

摘要: 2017年是Java界最动荡的一年。期待已久的Java 9带来了许多的变化和有趣的新功能,同时Oracle也宣布了JDK最新的发布时间表。而这一切只是个开始。过去开发人员常常抱怨Java的发展速度不够快。我认为这些抱怨将在不久 ...

模型 Java Hadoop Oracle Spring

在过去的一年中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

欢迎加入本站公开兴趣群
软件开发技术群
兴趣范围包括:Java,C/C++,Python,PHP,Ruby,shell等各种语言开发经验交流,各种框架使用,外包项目机会,学习、培训、跳槽等交流
QQ群:26931708

Hadoop源代码研究群
兴趣范围包括:Hadoop源代码解读,改进,优化,分布式系统场景定制,与Hadoop有关的各种开源项目,总之就是玩转Hadoop
QQ群:288410967 

鲜花

握手

雷人

路过

鸡蛋

相关阅读

最新评论

热门频道

  • 大数据
  • 商业智能
  • 量化投资
  • 科学探索
  • 创业

即将开课

 

GMT+8, 2018-6-19 01:25 , Processed in 0.183486 second(s), 25 queries .