Java 最新版本有哪些特点?Oracle 每六个月发布一次新的 Java 版本。Java 17 是最新版本,具有令人兴奋的功能。
介绍
Java 17是主流 Java 的最新长期支持版本,现已准备好在生产中使用。甲骨文还表示,获得至少八年产品支持的 LTS 版本将每两年发布一次,而不是目前的每三年发布一次。Oracle 为非 LTS 版本提供六个月的支持。
特定于上下文的远程代码执行过滤器支持和 switch 语句的模板识别预览是即将发布的标准 Java 版本中的两个新功能。自几年前发布的上一个 LTS 版本 JDK 11 以来引入的所有内容都包含在JDK 17中。让我们详细了解一下Java 17。
为什么 Java 17 很重要?
为了提高当前应用程序的性能或用户体验,必须升级到 Java 17。
根据应用程序和环境,您可能需要在迁移时更改某些代码。开发人员和其他团队成员必须更新本地环境。运行时环境也需要升级,例如生产和构建服务器环境中使用的环境。
团队可以通过在他们的 Docker 镜像中提及它来升级到最新的 Java 版本。这不会影响当前使用早期版本 Java 的任何其他团队,因为其他团队仍然可以使用早期版本的 Docker 映像。
这同样适用于基于 Kubernetes 的环境。团队可以随时更新 Docker 映像并部署所有内容,以更新到更新的 Java 版本。
面向开发人员的功能——JEP 列表
以下是Java 17 的特性:
恢复始终严格的浮点语义(JEP 306):
恢复始终严格的浮点语义后,浮点运算将变得统一严格。在 Java Standard Edition 1.2 中包括严格和默认的浮点模式,使语言和虚拟机恢复到它们原来的浮点语义。该项目旨在使构建对数字敏感的库(如 java.lang.Math 和 java.lang.StrictMath)变得更加容易。
增强型伪随机数生成器 (JEP 356):
尽管 Random 和 SplittableRandom 提供了一组几乎相同的方法(例如,nextInt()、nextDouble() 和流生成函数,如 ints() 和 longs()),但很难在应用程序中在它们之间切换甚至替换它们具有不同的算法。所有随机数生成器通用的方法 nextInt() 和 nextDouble() 在 RandomGenerator 中指定。所以,将来,如果你只需要这些方法,你应该总是使用这个接口。
框架中出现了三种新的随机数生成器类别:
JumpableGenerator提供了一个接口,用于按适度的数字(例如,264)向前跳转。
LeapableGenerator提供了一个接口,用于向前跳跃很多随机数(例如,2128)。
ArbitrarilyJumpableGenerator提供了额外的方法来跳过任意数量的随机数。
为了在未来的随机数生成器实现中重用代码,现有类中的重复代码也被删除并提取到非公共抽象类中。
新的 macOS 渲染管道 (JEP 382):
使用新的 Apple Metal 框架,macOS 需要新的 Java 2D 渲染管道。Java 2D 目前完全依赖于 OpenGL。Metal 框架取代了 Apple 在 macOS 10.14 中弃用的 OpenGL 渲染库。
macOS/AArch64 端口(JEP 391):
Java 已经有一个 Linux AArch64 端口,Windows 开发正在进行中。通过使用 JDK 端口实现中常见的条件编译,Java 设计人员预计能够重用这些端口中的现有 AArch64 代码,以解决低级约定的变化,例如程序二进制接口和保留处理器寄存器集。预集成测试将减少 MacOS/AArch64 更改破坏当前 Windows/AArch64、Linux/AArch64 和 MacOS/x64 端口的可能性。
弃用用于移除的 Applet API (JEP 398):
当前的 Web 浏览器不再支持 Java 小程序,并且 Java 9 声明它们已“弃用”。在 Java 17 中,JDK 增强提案 398 将它们指定为“已弃用以删除”。因此,它们将在即将推出的其中一个版本中被完全淘汰。
强封装 JDK 内部结构 (JEP 403):
对所有 JDK 内部组件的强封装,除了像 sun.misc.unsafe 这样的重要组件。从 JDK 9 到 JDK 16,通过一个命令行参数来放松对内部组件的严格封装是行不通的。
Switch 的模式匹配(预览版)(JEP 406):
在Java 17中,可以使用开关运算符的模式匹配预览功能。这使您能够在 switch 语句中使用 instanceof 来查找特定类型的变量,然后采取适当的操作。例如,您可以使用 switch 浏览二叉树,并使用 return 运算符获取特定节点的内容。通过将 -enable-preview 作为编译器的输入,Java 17 用户已经可以试验此功能。
删除 RMI 激活 (JEP 407):
RMI 激活机制不再使用并且已过时。JEP 385 将其指定为已弃用以在 Java SE 15 中删除。针对该弃用,没有收到任何评论。有关完整的上下文、理由、危险和选项,请参阅 JEP 385。JavaBeans 激活框架是一种技术,是 Java EE 平台 (JAF) 的一部分。作为 Eclipse EE4J 程序的一部分,它后来被命名为 Jakarta Activation。RMI Activation 与 JavaBeans Activation 或 Jakarta Activation 技术没有任何关系,从 Java SE 中移除它们也没有影响。
密封类(JEP 409):
当前应用程序处理的真实世界数据已被证明可以通过具有类和接口的继承层次结构的面向对象数据模型很好地建模。Java 语言的表现力是一个关键特性。然而,在某些情况下,缓和这种表现力是有益的。例如,Java 允许枚举类模拟特定类具有有限数量实例的情况。
删除实验 AOT 和 JIT 编译器 (JEP 410):
实验性 AOT 和 JIT 编译器已被删除,因为它没有被广泛使用并且需要大量维护。为了让开发人员继续使用外部生成的编译器版本进行 JIT 编译,该策略要求保留 Java 级别的 JVM 编译器接口。被称为 AOT 编译的 jaotc 工具是作为实验性功能添加到 JDK 9 中的。对于 AOT 编译,该工具利用了同样用 Java 编写的 Graal 编译器。没有投诉,因为 Oracle 的 JDK 16 构建不包含这些实验性Java 17 功能. 三个 JDK 模块——jdk.aot(jaotc 工具)、jdk.internal.vm.compiler.management(Graal MBean)和 internal.vm.compiler(Graal 编译器)——作为建议方法的一部分被删除。AOT 编译相关的 HotSpot 代码也已被删除。
弃用安全管理器以移除 (JEP 411):
自 Java 1.0 以来一直是平台一部分的安全管理器的主要目的是保护计算机和用户数据免受下载的 Java 小程序的侵害。这些是在沙箱内启动的,安全管理器在沙箱中限制对网络和文件系统资源的访问。
安全管理器的这一功能将不再适用,因为 Java 小程序已被指定为“不推荐删除”,如上一节所述。安全管理器可以使用除浏览器沙箱之外的策略文件来保护服务器程序,这通常禁止访问资源。Elasticsearch 和 Tomcat 是两个例子。
然而,鉴于这需要复杂的配置,并且现在可以通过 Java 模块系统或通过容器化隔离更有效地实现安全性,因此人们不再对它感兴趣。
安全管理器也需要大量的维护工作。JDK 开发人员必须使用安全管理器为 Java 类库的每个扩展确定他们需要添加多少安全性。
外部函数和内存 API(孵化器)(JEP 412):
开发人员可以使用这个 Foreign Function and Memory API 来访问存储在 JVM 外部的代码(外部函数)、保存在 JVM 外部的数据(堆外数据)以及不受 JVM 控制的内存(外部内存)。
Vector API(第二个孵化器)(JEP 414):
此功能最初作为 Java 16 的一个组件在 JEP 338 中提出,目前正在进行第二次迭代。Vector API 的性能是 Java 17 的主要目标。目的是构建一个清晰、平台无关且可靠的 API。
特定于上下文的反序列化过滤器 (JEP 415):
对象的创建、它们字段的值以及它们之间的关系都基于传入数据流的内容,这使得反序列化不受信任的材料具有固有的风险。流中的字节经常来自身份不明、不受信任或未经身份验证的客户端。对手可以通过精心制作流来怀有恶意地运行来自任意类的代码。如果对象形成的副作用改变状态或触发额外的操作,应用程序组件、库对象甚至 Java 运行时的工作可能不会那么有效。
流程功能 - LTS(长期支持)
众所周知,Java 平台版本具有冗长且不精确的历史。虽然计划每三年发布一次,但该过程通常需要四年才能完成。
负责平台发展的团队还选择改变发布节奏以适应当前的市场动态,其中创新和迅速行动已变得至关重要。
六个月功能发布模型:
得益于新的六个月功能发布策略,平台开发人员现在可以在准备就绪时交付功能。因此,不再急于将该功能推入发布或延迟数年。他们不再需要等待三到四年才能为平台用户提供该功能。
长期支持模型:
Java 经常用于企业应用程序;因此,稳定性很重要。维护对所有这些版本的支持并提供补丁更新是昂贵的。因此开发了长期支持 (LTS) 版本,为用户提供更多支持。由于错误修正、性能升级和安全补丁,这些版本不可避免地变得更加可靠和安全。
结论,Java 17 为开发人员和用户添加了许多功能。它使构建具有挑战性的 Java 和 Web 应用程序变得简单。为了更好的开发,添加和删除了许多功能。Java 17 无疑是程序员和其他平台用户的一大享受。它的新安全功能确实非常出色。