Java 17计划于 9 月 14日发布,来自不同供应商的版本将在当天或之后发布。Java 17 的特别之处当然是 Oracle 和 OpenJDK 社区都决定这将是一个长期支持版本,就像 Java 11 和之前的 Java 8 一样。
自从从 Java 10 开始引入快速发布节奏以来,除 Oracle 之外的许多供应商都加紧生产具有各种级别支持的生产就绪二进制文件,包括Amazon、Azul、BellSoft、Microsoft、SAP和Eclipse Adoptium(以前为AdoptOpenJDK)。
下面是新的特性:
- macOS 上的 AArch64 支持
- 密封类
- 其他新功能
其他限制或弃用功能:
- JDK内部元素强封装
在Java9中,如果用户尝试使用反射或喜欢绕过使用其他内部 API 的正常限制,则会发出运行时警告。还添加了命令行参数来控制此行为。在 Java 16 中,默认设置从发出警告更改为通过抛出异常拒绝访问,但仍保留命令行参数以更改行为。
现在在 Java 17 中,进一步删除了这些命令行参数,当然也能禁用此限制,这意味着对这些内部 API 的所有未经授权的访问现在都被强封装。
好处:
- 继续提高 JDK 的安全性和可维护性
- 鼓励开发人员从使用内部元素迁移到使用标准 API,以便他们和他们的用户可以轻松升级到未来的 Java 版本。
- 始终严格的浮点语义
Java 17 删除了以前的默认语义,所有浮点运算现在都严格执行。该关键字strictfp仍然存在,但没有效果并产生编译时警告。
- 删除实验性 AOT 和 JIT 编译器
Java 9 引入了提前 (AOT) 编译作为使用 Graal 编译器(一种用 Java 编写的 JIT 编译器)的实验性功能。Java 10 使用添加的 JVMCI 接口使 Graal 编译器可用作 OpenJDK 中的 JIT 编译器。
在JEP 410 中,AOT 和 JIT 编译器已被删除。
- 删除RMI 激活
- 删除Applet API
- 弃用安全管理器
安全管理器的弃用始于 Java 12,其中添加了一个禁止使用它的命令行参数,从 Java 18 开始,该命令行参数将默认为禁止在运行时设置安全管理器。Java 17 中的更改意味着在尝试从命令行或在运行时动态设置安全管理器时,JVM 将产生运行时警告。
孵化器和预览功能
许多人想知道 Java 17 是否会有任何孵化器和预览功能,因为它被提升为一个长期支持的版本,并且可能支持一个改变或长时间没有被淘汰的功能似乎是不明智的。但是我们来了,Java 17 有两个孵化器模块和一个预览语言功能!
- Vector API
以前,开发人员要么必须依赖标量操作,要么必须使用/开发特定于平台的本机库。在 Java 中实现 Vector API 还可以为当前架构没有必要指令的事物提供优雅的回退,而是必须回退以以不同的方式计算。
虽然不是此 JEP 的一部分,但 Vector API 的标准化也使 JDK 中的类能够使用它。诸如 Arrays.mismatch 之类的方法,如今在某些平台上具有固有的矢量化实现,可以重写以使其全部在 Java 中运行,从而无需在 JVM 中编写和维护多个特定于平台的实现。
- 外部函数和内存 API
- Switch模式匹配
以前,如果您想根据对象的动态类型执行不同的操作,您需要使用 instanceof 检查创建一个 if-else if 链,例如:
String type(Object o) { |
结合使用 switch 表达式和 switch 的新模式匹配,它可以简化为:
String type(Object o) { |