Skip to main content

Java 17 新特性 (LTS)

官方发布介绍页面:https://openjdk.org/projects/jdk/17/

1. 密封类​

Sealed Classes 允许类或接口限制哪些其他类或接口可以扩展或实现它们。

public abstract sealed class Shape permits Circle, Square {}

public final class Circle extends Shape {
// Implementation
}

public final class Square extends Shape {
// Implementation
}

2. switch 支持模式匹配 (第一次预览)​

Pattern Matching for switch 允许在 switch 语句中使用模式匹配。

static String formatterPatternSwitch(Object obj) {
return switch (obj) {
case Integer i -> String.format("int %d", i);
case Long l -> String.format("long %d", l);
case Double d -> String.format("double %f", d);
case String s -> String.format("String %s", s);
default -> obj.toString();
};
}

3. 强封装 JDK 内部元素​

JDK 内部元素现在被强封装,无法通过反射访问。

4. 新增上下文特定的反序列化过滤器​

引入了上下文特定的反序列化过滤器,增强了反序列化的安全性。

import java.io.*;
import java.util.*;

public class DeserializationFilterExample {
public static void main(String[] args) throws IOException, ClassNotFoundException {
byte[] data = ...; // serialized data
ObjectInputFilter filter = ObjectInputFilter.Config.createFilter("maxdepth=3;java.base/*;!*");
try (ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(data))) {
ois.setObjectInputFilter(filter);
Object obj = ois.readObject();
}
}
}

5. 新的 macOS 渲染管道​

引入了新的 macOS 渲染管道,基于 Apple Metal API。

// 使用命令行参数来启用新的 macOS 渲染管道
// -Dsun.java2d.metal=true

6. 弃用 Applet API 以进行删除​

Applet API 被标记为即将移除。

7. 新的随机数生成器​

引入了新的随机数生成器接口和实现。

import java.util.random.*;

public class RandomExample {
public static void main(String[] args) {
RandomGenerator generator = RandomGeneratorFactory.of("L128X256MixRandom").create();
System.out.println(generator.nextInt());
}
}

8. 增强的伪随机数生成器​

增强了伪随机数生成器,提供了更多的算法和流接口。

import java.util.random.*;

public class EnhancedRandomExample {
public static void main(String[] args) {
RandomGenerator generator = RandomGeneratorFactory.of("L64X128MixRandom").create();
generator.ints(10).forEach(System.out::println);
}
}

9. 删除实验性 AOT 和 JIT 编译器​

移除了实验性的 AOT 和 JIT 编译器。