Java 17 是 Java 的一个版本,它于 2021 年 9 月发布。与 Java 16 相比,Java 17 带来了更多的新特性和改进,并修复了一些 bug。
Sealed Classes 是 Java 17 中引入的一个预览特性,是为了解决传统的类继承模型中容易导致类的滥用和破坏。Sealed Classes 可以限制类继承层次结构中的子类范围,从而提高代码的可靠性和可维护性。
开发人员可以使用 sealed、non-sealed 和 final 三个关键字对类进行标注:
示例代码如下:
public sealed class Shape permits Circle, Rectangle {
...
}
public non-sealed class Circle extends Shape {
...
}
public non-sealed class Rectangle extends Shape {
...
}
这里 Shape 类被声明为密封类,并且只有 Circle 和 Rectangle 类可以派生自它。
当我们试图扩展不在 permit 列表中的类时,编译器会报错。这使得代码更加健壮和安全。
Sealed Classes 还可以帮助我们轻松地维护继承层次结构,并降低代码复杂性。此外,它还可以促进更好的代码设计,避免出现过于复杂的继承结构。
Pattern Matching for switch 特性允许我们在 switch 语句中使用更简洁的方式匹配数据类型,并执行相应的操作。当 switch 表达式与某个模式匹配时,该模式所代表的分支将被执行。
示例代码如下:
public void printValue(Object obj) {
switch (obj) {
case Integer i -> System.out.println("Integer: " + i);
case String s -> System.out.println("String: " + s);
default -> System.out.println("Unknown Type: " + obj.getClass());
}
}
这种语法不仅简化了代码,而且提高了代码可读性和可维护性。使用该特性可以减少代码量,提高代码质量和可维护性。
Records 是 Java 16 中引入的一项新特性,Java 17 对它进行了进一步改进,使其更加易用和灵活。现在可以使用 Javadoc 来为 Record 类型生成文档,并且还支持注解地增强。
Record 类型是不可变的数据类,它自动提供了默认的 equals()、hashCode() 和 toString() 实现。这些方法使得编写不变量类变得更加简单和安全。
示例代码如下:
public record Point(int x, int y) {}
Point p = new Point(3, 4);
System.out.println(p.x()); // 3
System.out.println(p.y()); // 4
Java 17 引入了一组新的伪随机数生成器 API,包括 Xoshiro 和 LXM 算法等。这些算法可以生成更高质量的随机数,并提升应用程序性能和可伸缩性。
示例代码如下:
ThreadLocalRandom.current().ints(0, 10).limit(5).forEach(System.out::println);
这段代码会输出 5 个随机整数,范围在 0 到 10(不包括 10)之间。
Foreign Linker API 是 Java 17 中引入的另一个重要特性,它提供了通用的、类型安全的方式来调用本地代码,并实现与 C 语言等其他语言的互操作。这种方式在高性能计算、机器学习和深度学习等领域中具有广泛应用。
示例代码如下:
// 定义本地函数原型
CLinker.CLinkerFunction<Integer, Integer> squareFunc = CLinker.getInstance().downcall(
CLinker.systemLookup().lookup("square").get(),
CLinker.CLinkerFunction.of("(I)I", x -> x * x),
FunctionDescriptor.of(Integer.class, Integer.class)
);
// 调用本地函数
int result = squareFunc.apply(5);
System.out.println(result); // 25
这里 CLinker 用于调用 C 语言中定义的 square 函数,并将其映射到 Java 中。这种方式可以解决 Java 应用程序与其他语言之间的接口问题。
Java 17 仍然存在以下已知问题:
Sealed Classes 功能实验性:Sealed Classes 目前是实验性的,并且可能在将来的 Java 版本中发生改变。
Foreign Linker API 功能实验性:Foreign Linker API 目前是实验性的,并且可能在将来的 Java 版本中发生改变。
Java 17 修复了许多 bug,包括但不限于以下几个方面:
修复了一些垃圾回收器可能导致的应用程序停顿或崩溃的问题;
修复了一些错误代码编译失败的问题;
修复了一些 JDK 工具无法使用的问题。
移除了 AppletViewer 工具;
废弃了 java.xml.bind 模块,推荐使用 jaxb-runtime 替代。
Java 17 需要运行在最新的操作系统版本上,如 Windows 11、MacOS 10.15 和 Ubuntu 20.04 等操作系统。
Foreign Linker API 目前是标准特性,可以直接使用。
综上所述,Java 17 引入了许多新的特性和改进,包括 Sealed Classes、Pattern Matching for switch、Records、Enhanced Pseudo-Random Number Generators、Foreign Linker API 等。开发人员应该根据自己的需求和实际情况选择合适的 Java 版本,并及时更新到最新版本以获取更好的性能和安全性。