Java 17

Java 17 是 Java 的一个版本,它于 2021 年 9 月发布。与 Java 16 相比,Java 17 带来了更多的新特性和改进,并修复了一些 bug。

一、新特性和改进:

  1. Sealed Classes (Preview)

Sealed Classes 是 Java 17 中引入的一个预览特性,是为了解决传统的类继承模型中容易导致类的滥用和破坏。Sealed Classes 可以限制类继承层次结构中的子类范围,从而提高代码的可靠性和可维护性。

开发人员可以使用 sealed、non-sealed 和 final 三个关键字对类进行标注:

  • 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 还可以帮助我们轻松地维护继承层次结构,并降低代码复杂性。此外,它还可以促进更好的代码设计,避免出现过于复杂的继承结构。

  1. Pattern Matching for switch (Standard)

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());
    }
}

这种语法不仅简化了代码,而且提高了代码可读性和可维护性。使用该特性可以减少代码量,提高代码质量和可维护性。

  1. Records

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
  1. Enhanced Pseudo-Random Number Generators

Java 17 引入了一组新的伪随机数生成器 API,包括 Xoshiro 和 LXM 算法等。这些算法可以生成更高质量的随机数,并提升应用程序性能和可伸缩性。

示例代码如下:

ThreadLocalRandom.current().ints(0, 10).limit(5).forEach(System.out::println);

这段代码会输出 5 个随机整数,范围在 0 到 10(不包括 10)之间。

  1. Foreign Linker API (Standard)

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 仍然存在以下已知问题:

  1. Sealed Classes 功能实验性:Sealed Classes 目前是实验性的,并且可能在将来的 Java 版本中发生改变。

  2. Foreign Linker API 功能实验性:Foreign Linker API 目前是实验性的,并且可能在将来的 Java 版本中发生改变。

三、修复的 bug:

Java 17 修复了许多 bug,包括但不限于以下几个方面:

  1. 修复了一些垃圾回收器可能导致的应用程序停顿或崩溃的问题;

  2. 修复了一些错误代码编译失败的问题;

  3. 修复了一些 JDK 工具无法使用的问题。

四、移除项和废弃项:

  1. 移除了 AppletViewer 工具;

  2. 废弃了 java.xml.bind 模块,推荐使用 jaxb-runtime 替代。

五、其它事项:

  1. Java 17 需要运行在最新的操作系统版本上,如 Windows 11、MacOS 10.15 和 Ubuntu 20.04 等操作系统。

  2. Foreign Linker API 目前是标准特性,可以直接使用。

综上所述,Java 17 引入了许多新的特性和改进,包括 Sealed Classes、Pattern Matching for switch、Records、Enhanced Pseudo-Random Number Generators、Foreign Linker API 等。开发人员应该根据自己的需求和实际情况选择合适的 Java 版本,并及时更新到最新版本以获取更好的性能和安全性。

你可能感兴趣的:(java历史版本,java,开发语言,jvm)