【Java编程】JDK18:Java18中的新特性

Chinese, Simplified

Java开发工具包(JDK)18定于2022年3月22日发布。标准Java的新版本将有九个新特性,特性集已于12月9日冻结。

自1月20日起,该版本进入了第二个降级阶段,此前上个月开始了第一个降级阶段。标准Java的升级每六个月发布一次,最新的JDK17将于9月份发布。

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

JDK18的候选版本将于2月10日和2月24日发布。虽然JDK 17是一个长期支持(LTS)版本,将获得Oracle至少八年的支持,但JDK 18将是一个短期功能版本,支持期为六个月。JDK18的早期访问版本可以在java上找到,用于Linux、Windows和MacOS。网

JDK 18提案的具体内容包括:

  • finalization在将来的版本中被删除(Deprecate finalization for removal in a future release)。Finalizer 的缺陷会在安全性、性能、可靠性和可维护性方面造成重大的现实问题。它还有一个困难的编程模型。默认情况下,目前已启用Finalization ,但可以禁用以便于早期测试。默认情况下,它将在功能版本中禁用,并在以后的版本中完全删除。该提案要求使用命令行选项来禁用标准JavaAPI中所有Finalizer 和Finalization 方法的Finalization 和弃用。该提案的目标包括帮助开发人员理解定稿的危险,为最终删除定稿做好准备,并提供简单的工具来帮助检测对定稿的依赖。在Java1.0中引入的Finalization 旨在帮助避免资源泄漏。类可以声明Finalizer (受保护的void finalize()方法),其主体释放任何底层资源。垃圾收集器将在回收对象内存之前,计划调用不可访问对象的Finalizer ;反过来,finalize方法可以执行诸如调用对象的close之类的操作。这似乎是防止资源泄漏的有效安全网,但存在缺陷,包括不可预测的延迟,从对象变得不可访问到调用其Finalizer 的时间间隔很长;不受约束的行为,Finalizer 代码可以执行任何操作,包括恢复对象并使其再次可访问;Finalizer 始终处于启用状态,没有明确的注册机制;Finalizer 可以在未指定的线程上以任意顺序运行。考虑到Finalization 的问题,建议开发人员使用其他技术来避免资源泄漏,即尝试使用resources语句和Cleaner。(有关详细信息,请参阅JDK增强方案421。)
  • 对于Internet地址解析SPI,建议为主机和名称地址解析定义一个SPI,以便Inet.Address 可以使用平台内置解析器以外的解析器。这项工作的动机包括更好地支持ProjectLowe、Java中的并发性和新编程模型,以及集成新的网络协议、定制和启用测试。该提案不涉及为JDK开发替代解析器。
  • switch模式匹配的第二个预览,其中Java语言将通过switch表达式和语句的模式匹配以及模式语言的扩展得到增强。这是在JDK 17中预览的。通过将模式匹配扩展到switch,可以针对多个模式测试表达式,每个模式都有一个特定的操作,因此可以简洁而安全地表达复杂的面向数据的查询。
  • 使用方法句柄重新实现核心反射将重新实现lang.reflect。方法、构造函数和位于java之上的字段。调用方法句柄。将方法句柄用作反射的底层机制将降低java和java的维护和开发成本。lang.reflect和java。lang.invoke API。
  • 使用简单的web服务器方案,将提供一个命令行工具来启动一个只提供静态文件的最小web服务器。没有CGI或类似servlet的功能可用。该工具将有助于原型设计、特殊编码和测试,特别是在教育环境中。该计划的目标包括提供一个开箱即用的静态HTTP文件服务器,具有简单的设置和最少的功能,减少开发人员的激活能量,使JDK更容易接近,并通过命令行提供一个默认实现,以及一个用于编程创建和定制的小API。提供功能丰富的或商业级服务器不是本提案的目标。
  • 外部函数和内存API的第二个孵化,其中引入了一个API,通过该API,Java程序可以在Java运行时之外与代码和数据进行互操作。通过调用外部函数(JVM外部的代码)和安全访问外部内存(JVM不管理的内存),API允许Java程序调用本机库并处理本机数据,而不会出现JNI(Java本机接口)的脆弱性和危险性。其目的是用一个优秀的纯Java开发模型取代JNI。这个API是在JDK 17中培育出来的。对于JDK18,将根据反馈进行改进,例如支持更多载体,如内存访问变量句柄中的布尔和MemoryAddress,以及在内存段之间复制Java数组的新API。
  • 向量API将在JDK 18中第三次孵化,之前在JDK 16和JDK 17中孵化过。该方案将在运行时编译的向量计算表示为支持的CPU架构上的最佳向量指令,实现优于等效标量计算的性能。向量操作表示一定程度的并行化,使更多的工作可以在单个CPU周期内完成,从而显著提高性能。平台无关矢量API旨在提供一种用Java编写复杂算法的方法,使用现有的热点自动矢量器,但使用一种用户模型,使矢量化更可预测。JDK18还将增加对ARM标量向量扩展平台的支持,并改进向量操作的性能,这些向量操作在支持硬件掩蔽的体系结构上接受掩蔽。
  • 将UTF-8指定为标准JavaAPI的默认字符集。UTF-8是一种用于电子通信的可变宽度字符编码,被认为是web的标准字符集。字符集是一种字符编码,能够对web上的所有字符进行编码。通过此更改,依赖于默认字符集的API将在所有实现、操作系统、区域设置和配置中保持一致。该提案并不打算定义新的Java标准或JDK特定的API。该提案的支持者预计,Java选择UTF-8不会对许多环境中的应用程序产生影响,因为MacOS、许多Linux发行版和许多服务器应用程序已经支持UTF-8。但是,在其他环境中也存在风险,最明显的是,依赖默认字符集的应用程序在处理未指定默认字符集时生成的数据时会表现不正确。数据损坏可能会悄然发生。预计主要影响将落在亚洲地区Windows系统的用户身上,可能还会落在亚洲和其他地区的某些服务器环境上。
  • JavaAPI文档中的代码片段,包括为JavaDoc的标准Doclet引入@snippet标记,以简化API文档中示例源代码的包含。该计划的目标之一是通过提供对源代码片段的API访问来促进源代码片段的验证。虽然正确性是作者的责任,但JavaDoc和相关工具中增强的支持可以使其更容易实现。其他目标包括启用现代样式,如语法突出显示,以及名称与声明的自动链接,以及更好地支持IDE创建和编辑代码段。该提案指出,API文档的作者经常在文档注释中包含源代码片段。

原文:https://www.infoworld.com/article/3630510/jdk-18-the-new-features-in-ja…

本文:https://jiagoushi.pro/node/1810

SEO Title
JDK 18: The new features in Java 18