跳到主要内容

JDK 14 新特性详解

· 阅读需 5 分钟

Java 14 作为一个非长期支持版本,引入了多个重要的预览特性和语言改进。

1. Records(预览)

Records 是 Java 14 中最引人注目的新特性,它简化了数据类的创建:

public record Point(int x, int y) {
// 编译器自动生成:
// - 构造方法
// - equals() 和 hashCode()
// - toString()
// - getter 方法
}
java

主要优点:

  • 简化不可变数据类的创建
  • 自动生成常用方法
  • 提高代码可读性
  • 减少样板代码

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

主要特点:

  • 使用箭头语法(->)
  • 支持多个 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);
}
}
java

使用示例:

Point p = new Point(3, 4);
System.out.println(p.x()); // 访问字段
System.out.println(p.toString()); // 自动生成的方法
Point o = Point.origin(); // 调用静态方法
java

4. instanceof 的模式匹配(Preview)

引入了 instanceof 的模式匹配预览特性:

// 旧方式
if (obj instanceof String) {
String s = (String) obj;
// 使用字符串 s
}

// 新方式
if (obj instanceof String s) {
// 直接使用字符串 s
System.out.println(s.length());
}
java

5. 打包工具(Incubator)

引入了新的打包工具 jpackage:

jpackage --name myapp --input target/ --main-jar myapp.jar
bash

功能特点:

  • 创建原生安装包
  • 支持多平台(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
);
java

改进:

  • 支持持久性内存
  • 提供了数据持久化保证
  • 改进了性能

7. 改进的 NullPointerException

提供了更详细的空指针异常信息:

// 假设有如下代码
person.getAddress().getStreet().toUpperCase();

// 如果 getAddress() 返回 null,新的异常消息会指出具体位置:
// NullPointerException: Cannot invoke "Address.getStreet()" because
// the return value of "Person.getAddress()" is null
java

8. ZGC 的 Mac OS X 和 Windows 支持

扩展了 ZGC 对操作系统的支持:

# 在 Windows 或 Mac OS X 上启用 ZGC
java -XX:+UnlockExperimentalVMOptions -XX:+UseZGC
bash

特点:

  • 跨平台支持
  • 低延迟垃圾收集
  • 可扩展性改进

9. 弃用 ParallelScavenge + SerialOld GC 组合

# 不再推荐使用的组合
java -XX:+UseParallelGC -XX:-UseParallelOldGC
bash

10. 删除 CMS 垃圾收集器

完全移除了 CMS(Concurrent Mark Sweep)垃圾收集器:

# 不再支持
java -XX:+UseConcMarkSweepGC # 将无法使用
bash

10. 其他改进

10.1 外部存储器访问 API(孵化)

MemorySegment segment = MemorySegment.allocateNative(100);
segment.setLong(0, 10);
long value = segment.getLong(0);
java

10.2 文本块改进(第二次预览)

String html = """
<html>
<body>
<h1>Hello, World!</h1>
</body>
</html>
""";
java

总结

JDK 14 是一个充满创新的版本,它不仅带来了 Switch 表达式这样的正式特性,还引入了记录类型和模式匹配等重要的预览特性。这些新特性都致力于简化 Java 开发,提高代码的可读性和可维护性。

虽然是非 LTS 版本,但 JDK 14 中的许多特性为 Java 语言的现代化发展指明了方向。建议开发者在开发环境中尝试这些新特性,特别是已经正式发布的 Switch 表达式,为未来的 Java 开发做好准备。同时,要注意预览特性在生产环境中的使用限制,确保系统的稳定性。