标准Java版本每6个月发布一次,自上一个长期支持版本JDK 17从去年9月发布以来,到目前为止6个月的发布周期即将到期。在近期InFoWord有消息称,截止至2月24日,Java开发工具包JDK 18已经进入了最终候选发布阶段。新版本的标准Java将于2022年3月22日最终发布,将有9个新功能出现在新版本中。

OpenJDK页面列出了以下正式针对JDK 18的功能:服务提供商接口、简单的网络服务器、矢量API的第三次孵化、代码片段、核心反射的重新实现、UTF-8字符集、外部函数和内存API的第二次孵化、开关语句的模式匹配的第二次预览,以及最后增加的最终化的废弃。

JDK 17是一个长期支持(LTS)版本,将从Oracle获得至少八年的支持,而JDK 18将是一个短期功能版本,支持时间为六个月。在Java.net上可以找到JDK 18的早期访问版本,其适用于Linux、Windows和MacOS。

下面笔者将带你们看下关于JDK 18新功能提案的具体内容:

  • 提案中有一条关于废弃Finalization(最终化)的,该建议要求提供一个命令行选项来禁用Finalization,并在标准Java API中废弃所有最终化器和最终化方法。其目标是为了帮助开发者了解最终化的危险,提供一个见到的工具来帮助检测对最终化的依赖,并为移除最终化做好准备。最早在Java 1.0中引入最终化是为了帮助开发者避免资源泄露。类可以声明一个终结器方法--protected void finalize()--其主体可以释放任何底层资源。垃圾收集器会在回收对象内存之前安排调用一个无法到达对象的终结器;反过来,终结器可以采取诸如关闭调用对象等行动来防止资源泄露。这确实是一个有效防止资源泄露的方法,但其存在缺陷,其中包括:不可预测的延迟,从一个对象变得不可更改到它的终结器被调用之间要等待很长时间;不受约束的行为,终结器代码可以采取任何行动,包括复活一个对象让其可再次被更改;总是随意启用,它没有一个明确的注册机制,终结器可以以任意顺序在未指定的线程上运行。因此以后Finalization可能在几个版本后完全移除,建议开发者使用其他技术来避免资源泄露,比如 try-with-resources 语句和清理器。(详见JDK增强建议421)。
  • 服务提供商接口:对于互联网地址解析SPI,建议定义一个用于主机和名称地址解析的SPI,以便于Inet.Address可以使用平台内置解析器以外的解析器。这项提案的目的在于更好地启用Project Loom,用于Java中的并发和新的编程模型,以及整合新的网络协议、定制和启用测试。值得一提的是该项目不涉及为JDK开发一个用来替代的解析器。
  • 开关语句的模式匹配的第二次预览:其中Java语言将增强switch表达式和语句的模式匹配,以及对模式语言的扩展。这早在JDK 17中就进行了预览。将模式匹配扩展到Switch中,将允许针对一些模式测试表达式,让每个模式都有特定的动作,以此达到简明而安全地表达复杂的面向数据的查询。
  • 核心反射的重新实现:用方法句柄重新定义核心反射将在java.lang.invoke方法句柄的基础上重新实现lang.reflect.Method、Constructor和Field。让方法句柄作为反射的底层机制可以减少java.lang.reflect和java.lang.invoke APIs的维护和开发成本。
  • 简单网络服务器:将提供一个命令行工具来启动最小的网络服务器,只提供静态文件,没有CGI或者类似servlet的功能。该工具将对原型设计、临时编码和测试有一定的用处,特别是在教育背景下。其目标包括一个开箱即用的静态HTTP文件服务器,具有简单的设置和最小的功能,以此来减少开发人员的激活能量,让JDK更加平易近人,并通过命令行提供一个默认的实现,以及一个小型的用于变成创建和定制的API。
  • 外部函数和内存API的第二次孵化:第二次对外部函数和内存API进行孵化,将在其中引入一个API,通过这个API,Java程序可以与外部代码和数据进行相互操作。通过调用外部函数(JVM以外的代码)以及安全的访问外部内存(JVM不管理的内存),该API将被允许Java调用本地库以及处理本地数据,而且还没有JNI(Java本地接口)那样的脆弱和危险。其谜底是用一个卓越的、纯粹的Java开发模型来取代JNI。这个API曾在JDK 17中得到实现。对于JDK 18,将根据反馈意见再次进行改进,如支持更多的载体,内存访问var句柄中的Boolean和MemoryAddress,以及将Java数组复制到内存段或从内存段内复制等功能。
  • 矢量API的第三次孵化:矢量API将在JDK 18中进行第三次孵化,之前早就在JDK 16和JDK 17中进行过孵化。这次改进将表达矢量计算,在运行时编译为支持CPU架构上的最佳矢量指令,实现优于同等标量计算的性能。矢量计算表达了一定程度的并行化,是更多贡多可以在一个CPU周期内完成,从而产生显著的性能改进。与本身平台无关的矢量API旨在提供一种在Java中编写复杂算法的方法,使用现有的HotSpot自动矢量器,但只使用一个用户模型,目的是为了让矢量化更加可以预测。JDK 18还将增加对ARM Scalar Vector Extension平台的支持,并提高在硬件中支持在屏蔽架构上接受屏蔽矢量操作的性能。
  • UTF-8字符集:JDK 18将使用UTF-8作为标准Java APIs的默认字符集。UTF-8是一种用于电子通信的可变范围字符编码,被认为是网络的标准字符集。字符集是能够对网络上的所有字符进行编码的字符编码。通过将UTF-8设为默认字符集,依赖默认字符集的API将在所有的实现、操作系统、地区和配置中都表现一致。这项建议无异于定义了一个新的Java标准或JDK特定API。这项建议的支持者认为,许多环境中的应用程序不会收到Java将UTF-8作为默认字符集的影响,因为MacOS、许多Linux发行版和许多服务器应用程序已经支持UTF-8。然而,在其他环境中就不一定了,最明显的是依赖默认字符集的应用程序在处理默认字符集时发现,该字符集不是指定字符集后会产生数据表现不正确的问题。数据可能会悄悄发生损坏。预计这项建议主要影响的应该是亚洲地区使用Windows系统的用户身上,也可能是亚洲和其他地区的一些服务器环境。
  • 代码片段:Java API文档中的代码片段,涉及为JavaDoc的标准Doclet引入@Snippet标签,以此来简化API文档中的示例源代码。该计划的目标之一是通过提供对谢谢片段的API访问来促进源代码片段的验证。虽然代码的正确性是作者的责任,但在JavaDoc和相关工具中加强支持可以使代码正确更容易实现。对于这条建议的其他目标包括启用现代风格,例如语法高亮,以及名称与声明自动链接,并使IDE对创建和编辑片段有更好地支持。

以上就是即将发布的JDK 18的新功能,我们可以看到有许多对开发者非常友好的更新。希望Java能在开发者的建议下变得更好。

参考链接:JDK 18: The new features in Java 18 | InfoWorld

Logo

20年前,《新程序员》创刊时,我们的心愿是全面关注程序员成长,中国将拥有新一代世界级的程序员。20年后的今天,我们有了新的使命:助力中国IT技术人成长,成就一亿技术人!

更多推荐