Java 15于2020年9月发布,作为一个非LTS(长期支持)版本,它带来了多项重要的JVM和语言特性更新。让我们来探讨一下Java 15的主要新特性。
1. 密封类(Sealed Classes)
密封类允许开发者对继承进行更精细的控制。
public sealed class Shape
permits Circle, Square, Rectangle {
// ...
}
final class Circle extends Shape {
// ...
}
final class Square extends Shape {
// ...
}
non-sealed class Rectangle extends Shape {
// ...
}
在这个例子中,Shape
类只允许Circle
、Square
和Rectangle
继承它。
2. 文本块(Text Blocks)
文本块使得处理多行字符串(如JSON、XML)变得更加容易。
String json = """
{
"name": "John Doe",
"age": 30,
"city": "New York"
}
""";
3. 模式匹配(Pattern Matching)类型检查
这是对Java 14中预览特性的增强。
if (obj instanceof String s && s.length() > 5) {
System.out.println(s.toUpperCase());
}
4. 隐藏类(Hidden Classes)
隐藏类允许在运行时创建不可发现的类,主要用于框架开发。
String className = "HiddenClass";
byte[] classData = // ... 生成类字节码
Class<?> hiddenClass = MethodHandles.lookup()
.defineHiddenClass(classData, true, MethodHandles.Lookup.ClassOption.NESTMATE)
.lookupClass();
5. 记录(Records)
记录类型提供了一种简洁的方式来声明不可变数据类。
public record Person(String name, int age) {}
// 等同于以下类
public final class Person {
private final String name;
private final int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String name() { return name; }
public int age() { return age; }
// equals, hashCode, toString 方法自动生成
}
6. 外部内存访问API
这是对Java 14中引入的孵化特性的增强,允许Java程序安全高效地访问本地内存。
MemorySegment segment = MemorySegment.allocateNative(100);
MemoryAddress address = segment.baseAddress();
MemoryAccess.setInt(segment, 0, 42);
int value = MemoryAccess.getInt(segment, 0);
7. 垃圾收集器更新
ZGC和Shenandoah垃圾收集器现在成为了标准API的一部分。可以通过JVM参数启用:
-XX:+UseZGC
-XX:+UseShenandoahGC
8. Edwards-Curve数字签名算法(EdDSA)
Java 15引入了EdDSA加密签名的实现。
KeyPairGenerator kpg = KeyPairGenerator.getInstance("Ed25519");
KeyPair kp = kpg.generateKeyPair();
Signature sig = Signature.getInstance("Ed25519");
sig.initSign(kp.getPrivate());
sig.update(msg);
byte[] s = sig.sign();
9. 重新实现传统DatagramSocket API
这个更新提供了更简单、更现代化的java.net.DatagramSocket
和java.net.MulticastSocket
API实现,使其更易于维护和调试。
DatagramSocket socket = new DatagramSocket();
InetAddress address = InetAddress.getByName("example.com");
byte[] buf = "Hello, DatagramSocket!".getBytes();
DatagramPacket packet = new DatagramPacket(buf, buf.length, address, 4445);
socket.send(packet);
Java 15虽然是一个非LTS版本,但它带来了多项重要的语言和JVM特性更新,为Java开发者提供了更多强大的工具和API。这些新特性不仅提高了开发效率,还为未来的Java版本奠定了基础。