Java SE 17 发布

经过六个月的开发,Oracle 发布了 Java SE 17(Java Platform, Standard Edition 17),它使用 OpenJDK 开源项目作为参考实现。 除了删除了一些已弃用的功能外,Java SE 17 保持与以前版本的 Java 平台的向后兼容性——大多数以前编写的 Java 项目在新版本下运行时仍然可以不加修改地运行。 Java SE 17(JDK、JRE 和 Server JRE)的可安装版本已为 Linux(x86_64、AArch64)、Windows(x86_64)和 macOS(x86_64、AArch64)准备。 由 OpenJDK 项目开发的 Java 17 参考实现在 GPLv2 许可下完全开放,具有 GNU ClassPath 例外,允许动态链接到商业产品。

Java SE 17 被归类为长期支持 (LTS) 版本,更新至 2029 年。 过去的 Java 16 临时版本的更新已经停止。 之前的 Java 11 LTS 分支将支持到 2026 年。 下一个 LTS 版本计划于 2024 年 10 月发布。 回想一下,从 Java XNUMX 的发布开始,项目切换到新的开发流程,这意味着新版本的形成周期更短。 现在正在一个不断更新的主分支中开发新功能,该分支包含已经完成的更改,并且每六个月从该分支分支一次以稳定新版本。

Java 17 的新特性包括:

  • 提出了一种在“switch”表达式中进行模式匹配的实验性实现,它允许在“case”标签中使用不精确的值,而是立即覆盖一系列值的灵活模板,对于这些值,“if ...”的繁琐链else" 表达式以前被使用过。 此外,在“开关”内部提供了处理 NULL 值的能力。 对象 o = 123L; 格式化的字符串 = switch (o) { case Integer i -> String.format("int %d", i); case Long l -> String.format("long %d", l); case Double d -> String.format("double %f", d); case String s -> String.format("String %s", s); 默认 -> o.toString(); };
  • 对其他类和接口不能用于继承、扩展或覆盖实现的密封类和接口的支持已经稳定。 基于允许扩展的子类的显式枚举,密封类还提供了一种比访问修饰符更能说明性地限制超类使用的方法。 包 com.example.geometry; 公共密封类 Shape 允许 com.example.polar.Circle、com.example.quad.Rectangle、com.example.quad.simple.Square {...}
  • 提出了向量 API 的第二个初步实现,它提供了使用 x86_64 和 AArch64 处理器的向量指令执行向量计算的函数,并允许您同时对多个值同时应用操作(SIMD)。 与 HotSpot JIT 编译器中提供的标量操作自动矢量化功能不同,新的 API 可以显式控制并行数据处理的矢量化。
  • 添加了 Foreign Function & Memory API 的初步实现,应用程序可以通过它与 Java 运行时之外的代码和数据进行交互。 新的 API 允许您高效地调用非 JVM 函数和访问不受 JVM 管理的内存。 例如,您可以在不使用 JNI 的情况下从外部共享库调用函数并访问流程数据。
  • 为 Java 2D API 提供支持的 macOS 渲染引擎,又由 Swing API 提供支持,已经适应使用 Metal 图形 API。 macOS 上的默认设置仍然是 OpenGL,启用 Metal 支持需要设置“-Dsun.java2d.metal=true”选项并至少拥有 macOS 10.14.x 版本。
  • 添加了 macOS/AArch64 平台的端口(基于新 Apple M1 芯片的 Apple 计算机)。 该端口的一个特点是支持W^X(Write XOR Execute)内存保护机制,其中内存页不能同时可用于写入和执行。 (代码只有在禁止写入后才能执行,只有在禁止执行后才能写入内存页)。
  • 返回对浮点表达式仅使用严格 (strictfp) 语义。 对自 Java 1.2 发布以来可用的“默认”语义的支持已被删除,其中包括在具有非常老的 x87 数学协处理器的系统上运行的简化(在引入 SSE2 指令后,不再需要额外的语义)。
  • 为伪随机数生成器实现了新型接口,并为更好的随机数生成实现了额外的算法。 应用程序有机会选择生成伪随机数的算法。 改进了对生成随机对象流的支持。
  • 对所有 JDK 内部实现了强制性强封装,关键 API(例如 sun.misc.Unsafe)除外。 强封装阻止尝试从代码访问内部类、方法和字段。 以前,可以使用“--illegal-access=permit”选项禁用严格封装,但现在已弃用。 需要访问内部类、方法和字段的应用程序应使用清单文件中的“--add-opens”选项或 Add-Opens 属性明确定义它们。
  • 应用程序能够定义用于反序列化数据的过滤器,这些过滤器可以依赖于上下文,并且可以结合某些反序列化操作动态选择。 您设置的过滤器适用于整个虚拟机(JVM 范围),即不仅涵盖应用程序本身,还涵盖应用程序中使用的第三方库。
  • Swing 添加了 javax.swing.filechooser.FileSystemView.getSystemIcon 方法来加载大图标,以改进高像素密度 (HighDPI) 屏幕上的 UI 渲染。
  • java.net.DatagramSocket API 支持连接到多播组,无需单独的 java.net.MulticastSocket API。
  • 改进了 IGV(理想图形可视化工具)实用程序,它提供了 HotSpot VM C2 JIT 编译器中中间代码表示的交互式可视化。
  • 在 JavaDoc 中,类比 javac 编译器,当输出错误时,现在会指示源文件中有问题的行数和错误位置。
  • 添加了 native.encoding 属性,反映系统字符编码的名称(UTF-8、koi8-r、cp1251 等)。
  • 添加了 java.time.InstantSource 接口,它允许您在不受时区限制的情况下操纵时间。
  • 添加了 java.util.HexFormat API 以转换为十六进制表示,反之亦然。
  • 编译器增加了黑洞模式,禁用死代码消除操作,可在进行性能测试时使用。
  • 向运行时添加“-Xlog:async”选项以异步写入日志。
  • 建立安全连接时,默认启用 TLS 1.3(以前使用 TLS 1.2)。
  • 以前弃用的用于在浏览器中运行 Java 应用程序的 Applet API(java.applet.Applet*、javax.swing.JApplet)已移至计划删除的类别(在结束对 Java 的支持后失去相关性)浏览器插件)。
  • 转移到计划删除的安全管理器类别,该类别早已失去相关性,并且在终止对浏览器插件的支持后无人认领。
  • RMI 激活机制已被删除,它已经过时,移至 Java 8 中的选项类别,并且几乎从未在现代实践中使用过。
  • SDK中去掉了一个实验性的编译器,支持JIT(just-in-time)为HotSpot JVM动态编译Java代码,以及抢占式编译(AOT,ahead-of-time)模式在启动虚拟机之前将类转换为机器代码。 编译器是用 Java 编写的,基于 Graal 项目的成果。 值得注意的是,维护编译器需要大量的劳动,这在开发人员缺乏需求的情况下是不合理的。

来源: opennet.ru

添加评论