过去的几年对Java世界一直是动荡不安的,在相当多的发行版中添加了各种各样的功能。
在开发人员社区中,人们逐渐意识到Java的开发速度不够快。 在最初的20年中,Java平台和Java开发工具包(JDK)经历了庞大,不规则且有些不可预测的步骤。 每个功能版本均由一个或多个重要功能驱动。 因此,每次发布的计划都被推迟了多次,以适应这些功能的完成。
这种方法很好地提供了高质量的大型新功能。 但是,较小的功能和应用程序编程接口(API)仅在大型功能就绪时才能交付。 几年前这是可以接受的,但现在已经不行了。 如今,开发人员可以从各种以更快速度发展的平台中进行选择。
在Sun Microsystems的领导下,最新版本是Java 1.6(又名Java 6),并且一直是五年来的最后一个主要Java版本。 Sun很快陷入麻烦,并最终被Oracle收购。
Java 7是Oracle领导下的第一个主要版本,其次是Java8。Java平台的演进是从Java 9开始的。就像Java 8都是关于lambda及其后果(功能编程,流和默认方法)一样。 ,Java 9主要涉及模块。
在查看Java 11中将出现哪些令人兴奋的新功能之前,让我们首先看一下自Java 9以来逐渐引入的新功能。
Java 9中引入的功能
在计划延迟后,Java 9于2017年9月21日发布。大多数开发人员认为Java 9主要与模块化有关。
Java 9版本及其功能是Java生态系统中的一个里程碑。 模块是构建和部署软件的新方法。 他们帮助开发人员创建了体积更小的架构更好的软件。 引入的关键功能是Project Jigsaw,JShell和其他一些功能改进。
Jigsaw项目是JDK 9中最大的功能,它为Java平台带来了模块化。 大型代码库通常会导致复杂,纠结的“意大利面条代码”。 封装代码而在系统的各个部分(Java归档文件或JAR文件)之间没有明确的依赖关系是非常具有挑战性的。
Jigsaw项目引入了类似于OSGi的模块化,其中可以使用附加的模块描述符来表达模块之间的依赖关系。 拼图项目是我们设想和开发大型应用程序的方式的一种范式转变。
在Java平台上的20年开发已经付出了巨大的代价。 许多类已经纠缠在一起,没有简单的方法将私有实现类封装在JDK中。 这鼓励了依赖内部细节的外部库的泛滥,同时也阻碍了平台的发展。
有了Project Jigsaw,现在Java 9附带了大约90个不同的模块,这些模块将相关软件包组合在一起。 只有从模块显式导出的软件包才能从其他模块访问。 这使得内部实现类的封装成为现实。
此外,模块可以指定对其他模块的依赖关系。 就像JDK已被模块化一样,应用程序也可以使用相同的技术。 您可以创建自己的模块来封装包并指定依赖关系,而不必使用脆弱的类路径(它具有重复的,丢失的或不一致的JAR)。 这将使结构更好,更可靠的应用程序大有帮助。
Java 9还引入了JShell(交互式Java REPL) ,它是Java Shell的缩写,也称为REPL(读取-评估-打印循环) 。 它增加了执行不同Java构造(如类,接口,枚举,对象和语句)的功能。 JShell具有多种用途,最常见的用途是对某些代码执行快速测试以了解其工作方式。 无需先创建一个类,编译它,然后运行它。 只需使用JShell进行快速测试即可。
引入了不同的功能改进,例如升级的网络通信和对具有HTTP / 2.0支持的WebSockets的支持,增强的Process API,以简化对操作系统进程的控制和管理,以及Stream API的改进,以创建对集合的声明性转换管道。
Java 10中引入的功能
Java 10于2018年3月20日发布。由于发布周期很短,因此仅引入了一些功能。 由于它应该是短期发布,因此JDK 10的公共更新计划在六个月内结束。 许多开发人员可能不会迁移到Java 10,因为他们希望等待Java 11。
长期以来,开发人员一直要求类型推断 ,因为许多静态类型语言已经支持此功能。
通过JEP 286,引入了局部变量类型推断 (JDK增强建议),新的关键字var缩短了局部变量的声明。 它指示编译器从其初始化程序中推断局部变量的类型。
在Java 10之前,我们曾经这样声明变量:
URL simpleProgrammer = new URL(http://www.simpleprogrammer.com);
URLConnection connection = simpleProgrammer.openConnection();
Reader reader = new BufferedReader(
New InputStreamReader(connection.getInputStream()));
使用Java 10,我们可以避免显式类型声明并编写如下代码:
var simpleProgrammer = new URL(http://www.simpleprogrammer.com);
var connection = simpleProgrammer.openConnection();
var reader = new BufferedReader(
New InputStreamReader(connection.getInputStream()));
通过从变量声明中删除冗余,关键字var使Java不再那么冗长。 可以根据使用它的上下文隐式确定变量的类型。
通过基于时间的发行版本控制 ,已更改了Java版本号的格式,以改善对基于时间的发行模型的支持。 新发行模型最显着的方面是发行内容可能会更改。
开始时,仅宣布发布日期。 但是,如果此新功能的开发花费的时间比预期的长,则将从发布节奏中删除该功能并将其不包括在内。 因此,需要一种描述时间流逝的版本号,而不是所包括的更改的性质。
G1中的并行完整GC是一个有趣的功能,可能会在大爆炸功能宣布的噪音中迷失。 实际上,许多开发人员甚至可能没有注意到它。
G1 GC是Java 8中引入的,它成为Java 9中的默认垃圾收集器。通过设计,它避免了完整的垃圾收集,但是仍然会发生。
G1仅使用单线程的mark-sweep-compact算法来执行完整收集,这可能会导致性能问题。
Java 10通过使用多个线程执行完整GC来解决此问题。 用于完全收集的线程数与用于年轻和混合收集的线程数相同。 现在,G1收集器的完整GC性能将得到显着改善。
长期发布和支持周期
Java 10刚刚发布,但是我们现在迫切希望在今年晚些时候发布Java 11。 由于Oracle旨在加快发布周期,因此我们将以更快的方式提供更多功能。 与JDK 10不同,Java 11将是一个长期支持版本,并将成为Java Platform Standard Edition(Java SE)11的参考实现。
除了新的发行系列,Oracle还更改了其支持模型。 在新的方案中,短期发布和长期发布之间有所不同。 像Java 9和10这样的短期发行版将接受公共更新,直到下一个功能发行版可用为止。 这意味着对Java 9的支持将于2018年3月终止,对Java 10的支持将于2018年9月之后终止。
Java 11有一个独特的区别,那就是它是第一个长期发行版,并且将得到更长时间的支持。 Java 11将在2023年9月之前获得Oracle的首要支持,并将支持扩展到2026年。
Java 11的新增功能?
Java 11可能会推出一些关键功能。 通过删除CORBA (人们仍在使用它), Java EE模块 (最近更名为Jakarta EE)和JavaFX ,Java 11可能还会失去一些功能。
二十多年前,CORBA是创建分布式应用程序的一种流行方式,但我认为现在它仅在旧版应用程序中使用。 Java EE和JavaFX不再完全适合JDK堆栈,现在还有其他第三方库提供这些功能。 让我们详细考虑这些方面。
Java 11计划的新功能
此时,Java 11设置为引入以下功能:
- JEP 318:Epsilon:任意低开销的垃圾收集器-Epsilon被称为“无操作”收集器,它承诺在不实现任何实际内存回收机制的情况下处理内存分配。 如提案中所述,目标是“以有限的内存分配和内存吞吐量为代价,提供一种有限的分配限制和最低的延迟开销的完全被动的GC实现。” Epsilon的特定用例包括性能测试,内存压力测试和虚拟机(VM)接口测试。 这对于寿命极短的作业,最后一次延迟的延迟或最后一次吞吐量的改善也很有用。
- JEP 323:Lambda参数的局部变量语法-Java 10中引入了局部变量类型推断,以减少与编写Java代码相关的冗长性。 Java 11通过允许使用var声明隐式类型的lambda表达式的形式参数来向前迈出了一步。
当前,您需要为lambda表达式指定参数,如下所示:
(var a, var b) -> a.process(b)
从Java 11开始,可以通过以下方式对其进行简化:
(a, b) -> a.process(b)
虽然这导致语法的统一,但也可以在不简短的情况下将修饰符应用于局部变量和lambda格式。 不需要多余的语法构造,因为可以从上下文中推断出它们。
- JEP 309:动态类文件常量-Java类文件格式将得到扩展,以支持新的常量池形式CONSTANT_Dynamic。 这将减少创建新形式的可实现类文件常量的成本并减少创建中断。 当前,链接invokedynamic呼叫站点会将链接委托给引导方法。 这是一条JVM指令,它允许编译器生成代码,该代码以比以前更宽松的规范来调用方法。 它提供了进行动态调用的功能,JVM不仅可以识别它,而且可以像优化普通的老式静态类型调用一样进行优化。 现在,加载CONSTANT_Dynamic会将创建委托到引导方法。 新的常量池形式将为语言设计人员和编译器实施人员提供更广泛的表达方式和性能选择。
更快的JDK发布和更短的支持周期
Oracle旨在加快发布周期,因此,我们将以更快的速度提供更多功能。 甲骨文去年宣布,2018年将发布两个JDK版本,并且JDK 10已经发布。 与缓慢发布周期的时代相比,这是一个可喜的变化,每几年主要发布中都会引入大量功能。
现在,我们可以期待每六个月发布一个较小的功能。 这具有许多好处,包括Java平台的更快创新。 降低了更新Java版本的风险。 较小的功能集使开发人员更容易采用。
更快的发布周期使Java成为一种敏捷而敏捷的语言。 它已成为一种动态语言,可以响应市场力量和开发人员社区的关注。
什么不会使Java 11发挥作用?
尽管Java 11可能会提供一些新功能,但它仍会比Java 10更为精简,这主要是因为一些遗留功能将被删除。
JEP 320:删除Java EE和CORBA模块旨在从Java SE平台和JDK中删除Java EE和CORBA模块。 实际上,这些模块在Java 9中已经过时,声明要在将来的版本中删除它们。
随着Java SE 6于2006年12月发布,其中包括了完整的Web服务堆栈。 这包括四种技术:
- JAX-WS-XML Web服务的Java API
- JAXB-用于XML绑定的Java体系结构
- JAF-JavaBeans激活框架
- Java通用注释
从那时起,Java EE版本不断发展,这使得Java SE难以在两个Java版本中包含无关的技术和繁琐的维护工作。 有第三方站点提供独立版本的Java EE技术,因此Oracle不再感到有义务将它们包含在Java SE或JDK中。
关于删除CORBA,这项技术来自1990年代,如今几乎没有人使用它开发应用程序。 由于CORBA的维护成本远远超过收益,因此Oracle认为Java SE或JDK中没有必要包含它。
准备好使用Java 11
作为Java开发人员,您现在可以选择每六个月更新一次Java版本,也可以选择每隔几年更新一次长期版本。
Oracle还建议每个人都迁移到其Java SE Advanced产品。 对于每个长期版本,它将至少提供五年的支持。 我认为,如果仍使用Java 8或Java 9之类的早期版本,则可以等待更长的时间,然后直接迁移到Java 11。
Java 11将通过令人兴奋的新功能(例如低开销的垃圾收集器),使用具有较少冗长性的lambda表达式以及为语言设计人员和编译器实施人员提供更多选择的新功能,帮助开发人员创建更好的软件。 Java世界的未来看起来令人兴奋。
翻译自: https://www.javacodegeeks.com/2018/06/expect-java-11.html