Java SE 17 的新增特性

恢复始终严格的浮点语义

这个 JEP 主要用于科学应用,它使浮点运算始终保持严格。默认的浮点运算是 strict 或 strictfp ,两者都能保证在每个平台上的浮点计算结果相同。

在 Java 1.2 之前,strictfp 行为也是默认的。然而,由于硬件问题,必须使用关键字 strictfp 来重新启用这种行为, 但是现在已经不需要使用这个关键字了。废弃 Applet API

由于许多网络浏览器已经取消了对 Java 插件的支持。所以 Java SE 17 将 Applet API 标记为删除。

强化封装 JDK 的内部结构

从 Java 9 引入模块化开始,JDK 对于其内部的 API 的访问限制就已经明确开始落地,只是当时我们可以通过配置启动参数 --illegal-access 来继续使用 JDK 的内部 API,其中 Java 9 ~ Java 15 这个参数默认 permit,Java 16 默认 deny。

JEP 403 中删除了标志 -illegal-access ,平台将忽略该标志,如果该标志存在,控制台将发出消息告知该标志的终止。按照提案的说明,被严格限制的这些内部 API 包括:

java.* 包下面的部分非 public 类、方法、属性,例如 Classloader 当中的 defineClass 等等。

sun.* 下的所有类及其成员都是内部 API。

绝大多数 com.sun.*jdk.*org.* 包下面的类及其成员也是内部 API。

具体可参考: Java 17 更新(6):制裁!我自己私有的 API 你们怎么随便一个人都想用?

Switch类型匹配(预览功能)

这是通过加强 switch 表达式和语句的模式匹配能力,减少了定义这些表达式所需的模板,此外,switch 中增加了空值的支持。

示例代码

package git.snippets.jdk17;/** * switch类型匹配(预览功能) * * @author Grey * @date 2021/11/29 * @since 17 */public class SwitchMatchTest {    public static void main(String[] args) {    }    record Human(String name, int age, String profession) {    }    record Circle() implements Shape {        public int getNumberOfSides() {            return 0;        }    }    interface Shape {    }    record Triangle() implements Shape {        public int getNumberOfSides() {            return 0;        }    }    public String checkObject(Object obj) {        return switch (obj) {            case Human h -> "Name: %s, age: %s and profession: %s".formatted(h.name(), h.age(), h.profession());            case Circle c -> "This is a circle";            case Shape s -> "It is just a shape";            case null -> "It is null";            default -> "It is an object";        };    }    public String checkShape(Shape shape) {        return switch (shape) {            case Triangle t && (t.getNumberOfSides() != 3) -> "This is a weird triangle";            case Circle c && (c.getNumberOfSides() != 0) -> "This is a weird circle";            default -> "Just a normal shape";        };    }}

移除 RMI Activation

详见: JEP 407: Remove RMI Activation

删除实验性 AOT 和 JIT 编译器

在 Java SE 9中,JEP 295 引入了超前编译(jaotc 工具),作为一个实验性功能。后来的 Java SE 10,JEP 317 又提出它是一个实验性的 JIT 编译器。

然而,这个功能自从它们被引入后就没有什么用处了,而且需要大量的精力来维护它,所以这个 JEP 删除了基于 Java 的实验性超前(AOT)和及时(JIT)编译器

以下 AOT 包、类、工具和代码被删除。

jdk.aot — the jaotc tool

jdk.internal.vm.compiler — the Graal compiler

jdk.internal.vm.compiler.management — Graal’s MBean

src/hotspot/share/aot — dumps and loads AOT code

以及由 #if INCLUDE_AOT 保护的额外代码

详见: JEP 410: Remove the Experimental AOT and JIT Compiler

Foreign Function & Memory API(孵化功能)

这个外来函数和内存API允许开发者访问 JVM 之外的代码(Foreign Function)、存储在 JVM 之外的数据(堆外数据),以及访问不由 JVM 管理的内存(foreign memory)。

P.S 这是一个孵化功能;需要添加 --add-modules jdk.incubator.foreign 来编译和运行 Java 代码。

一个示例:

Foreign Linker API examples in Java 16

详见: JEP 412: Foreign Function & Memory API (Incubator)

更多

Java SE 7及以后各版本新增特性

参考资料

JDK 17 Release Notes

Java17新特性

New Features in Java 17

What is new in Java 17

特性   Java   SE
发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章