JDK 14 新特性详解
· 阅读需 5 分钟
Java 14 作为一个非长期支持版本,引入了多个重要的预览特性和语言改进。
1. Records(预览)
Records 是 Java 14 中最引人注目的新特性,它简化了数据类的创建:
public record Point(int x, int y) {
// 编译器自动生成:
// - 构造方法
// - equals() 和 hashCode()
// - toString()
// - getter 方法
}
主要优点:
- 简化不可变数据类的创建
- 自动生成常用方法
- 提高代码可读性
- 减少样板代码
2. Switch 表达式(标准化)
经过多个版本的预览,Switch 表达式终于在 JDK 14 中正式发布。
int numLetters = switch (day) {
case MONDAY, FRIDAY, SUNDAY -> 6;
case TUESDAY -> 7;
case THURSDAY, SATURDAY -> 8;
case WEDNESDAY -> 9;
default -> throw new IllegalStateException("Invalid day: " + day);
};
主要特点:
- 使用箭头语法(->)
- 支持多个 case 标签
- 可以作为表达式使用
- 不会出现 fall through
- 穷尽性检查
3. 记录类型(Preview)
引入了记录类型(Record)作为预览特性:
public record Point(int x, int y) {
// 编译器自动生成:
// - 构造方法
// - getter 方法
// - equals() 和 hashCode()
// - toString()
// 可以添加静态字段和方法
public static Point origin() {
return new Point(0, 0);
}
// 可以添加实例方法
public double distanceFromOrigin() {
return Math.sqrt(x * x + y * y);
}
}
使用示例:
Point p = new Point(3, 4);
System.out.println(p.x()); // 访问字段
System.out.println(p.toString()); // 自动生成的方法
Point o = Point.origin(); // 调用静态方法
4. instanceof 的模式匹配(Preview)
引入了 instanceof 的模式匹配预览特性:
// 旧方式
if (obj instanceof String) {
String s = (String) obj;
// 使用字符串 s
}
// 新方式
if (obj instanceof String s) {
// 直接使用字符串 s
System.out.println(s.length());
}
5. 打包工具(Incubator)
引入了新的打包工具 jpackage:
jpackage --name myapp --input target/ --main-jar myapp.jar
功能特点:
- 创建原生安装包
- 支持多平台(Windows, macOS, Linux)
- 可以包含 JRE
- 支持自定义安装选项
6. 非易失性映射内存(Non-Volatile Mapped Byte Buffers)
增强了 MappedByteBuffer 实现:
FileChannel fileChannel = FileChannel.open(path, StandardOpenOption.READ,
StandardOpenOption.WRITE, StandardOpenOption.CREATE);
MappedByteBuffer buffer = fileChannel.map(
FileChannel.MapMode.READ_WRITE,
0,
fileSize
);
改进:
- 支持持久性内存
- 提供了数据持久化保证
- 改进了性能
7. 改进的 NullPointerException
提供了更详细的空指针异常信息:
// 假设有如下代码
person.getAddress().getStreet().toUpperCase();
// 如果 getAddress() 返回 null,新的异常消息会指出具体位置:
// NullPointerException: Cannot invoke "Address.getStreet()" because
// the return value of "Person.getAddress()" is null
8. ZGC 的 Mac OS X 和 Windows 支持
扩展了 ZGC 对操作系统的支持:
# 在 Windows 或 Mac OS X 上启用 ZGC
java -XX:+UnlockExperimentalVMOptions -XX:+UseZGC
特点:
- 跨平台支持
- 低延迟垃圾收集
- 可扩展性改进
9. 弃用 ParallelScavenge + SerialOld GC 组合
# 不再推荐使用的组合
java -XX:+UseParallelGC -XX:-UseParallelOldGC
10. 删除 CMS 垃圾收集器
完全移除了 CMS(Concurrent Mark Sweep)垃圾收集器:
# 不再支持
java -XX:+UseConcMarkSweepGC # 将无法使用
10. 其他改进
10.1 外部存储器访问 API(孵化)
MemorySegment segment = MemorySegment.allocateNative(100);
segment.setLong(0, 10);
long value = segment.getLong(0);
10.2 文本块改进(第二次预览)
String html = """
<html>
<body>
<h1>Hello, World!</h1>
</body>
</html>
""";
总结
JDK 14 是一个充满创新的版本,它不仅带来了 Switch 表达式这样的正式特性,还引入了记录类型和模式匹配等重要的预览特性。这些新特性都致力于简化 Java 开发,提高代码的可读性和可维护性。
虽然是非 LTS 版本,但 JDK 14 中的许多特性为 Java 语言的现代化发展指明了方向。建议开发者在开发环境中尝试这些新特性,特别是已经正式发布的 Switch 表达式,为未来的 Java 开发做好准备。同时,要注意预览特性在生产环境中的使用限制,确保系统的稳定性。