跳到主要内容

JDK 15 新特性详解

· 阅读需 5 分钟

Java 15 作为一个非长期支持版本(non-LTS),于2020年9月15日正式发布。这个版本带来了一些重要的新特性,包括文本块的正式发布和密封类的预览等。本文将详细介绍 JDK 15 中的主要变更和新特性。

1. 文本块(正式发布)

文本块特性在经过多个版本的预览后终于正式发布。

// 传统字符串写法
String json = "{\n" +
" \"name\": \"John\",\n" +
" \"age\": 30\n" +
"}";

// 文本块写法
String json = """
{
"name": "John",
"age": 30
}
""";

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

主要特点:

  • 无需转义字符
  • 保持原始格式
  • 支持字符串格式化
  • 提供更好的可读性

2. 密封类(预览)

密封类是 Java 15 中最重要的新特性之一:

public sealed class Shape 
permits Circle, Rectangle, Square {
// 类的实现
}

public final class Circle extends Shape {
// Circle 的实现
}
java

主要特点:

  • 限制继承层次结构
  • 提高代码安全性
  • 支持模式匹配
  • 更好的类型系统

3. Records(第二次预览)

继续改进 Records 特性:

public record Person(String name, int age) {
// 紧凑构造器
public Person {
if (age < 0) {
throw new IllegalArgumentException("Age cannot be negative");
}
}

// 可以添加静态字段和方法
public static Person unknown() {
return new Person("Unknown", 0);
}

// 可以添加实例方法
public boolean isAdult() {
return age >= 18;
}
}
java

4. 隐藏类(Hidden Classes)

引入了隐藏类的概念:

// 框架代码示例
byte[] classBytes = // 生成的字节码
Class<?> dynamicClass = MethodHandles.lookup()
.defineHiddenClass(classBytes, true)
.lookupClass();
java

用途:

  • 框架开发
  • 动态代理实现
  • 性能优化

5. ZGC 功能增强

ZGC 得到了进一步增强:

# 启用 ZGC
java -XX:+UseZGC
bash

改进:

  • 支持在大型机上运行
  • 改进了内存管理
  • 优化了垃圾收集性能

6. 外部存储器 API(第二次孵化)

改进了外部存储器访问 API:

// 分配本机内存
MemorySegment segment = MemorySegment.allocateNative(100);

// 写入数据
segment.set(ValueLayout.JAVA_INT, 0, 42);

// 读取数据
int value = segment.get(ValueLayout.JAVA_INT, 0);

// 释放内存
segment.close();
java

7. instanceof 的模式匹配(第二次预览)

继续改进 instanceof 的模式匹配:

// 传统方式
if (obj instanceof String) {
String s = (String) obj;
if (s.length() > 5) {
System.out.println(s.toUpperCase());
}
}

// 模式匹配方式
if (obj instanceof String s && s.length() > 5) {
System.out.println(s.toUpperCase());
}
java

8. 移除 Nashorn JavaScript 引擎

完全移除了 Nashorn JavaScript 引擎:

// 不再支持
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("nashorn"); // 将无法使用
java

替代方案:

  • 使用 GraalVM
  • 使用其他 JavaScript 运行时
  • 采用原生 JavaScript 解决方案

9. 禁用和废弃偏向锁

# 禁用偏向锁
-XX:-UseBiasedLocking
bash

原因:

  • 现代处理器的性能提升
  • 同步机制的改进
  • 简化 JVM 实现

10. 重新实现 DatagramSocket API

改进了 DatagramSocket API:

// 新的实现方式
DatagramSocket socket = new DatagramSocket();
socket.bind(new InetSocketAddress(8080));
java

特点:

  • 更好的可维护性
  • 更现代的实现
  • 更好的异常处理

总结

JDK 15 虽然是一个非 LTS 版本,但它带来了一些重要的改进和新特性。文本块的正式发布为多行字符串处理提供了更优雅的解决方案,而密封类的引入则为类型系统带来了新的可能性。

同时,Records 和模式匹配等预览特性的持续改进,展示了 Java 语言不断现代化的努力。虽然这些特性大多还在预览阶段,但它们为 Java 开发带来了更多的表现力和便利性。

建议开发者在开发环境中尝试这些新特性,特别是已经正式发布的文本块,同时密切关注预览特性的发展。在生产环境中使用时,要注意特性的稳定性和兼容性问题。