JDK15新特性
1. 密封类和接口(预览版)(JEP 360)
密封类和接口允许创建受限的类继承结构,控制哪些类可以继承或实现它们。
public sealed interface Shape permits Circle, Rectangle, Triangle {}
final class Circle implements Shape {}
final class Rectangle implements Shape {}
non-sealed class Triangle implements Shape {}
public class SealedClassesDemo {
public static void main(String[] args) {
Shape shape = new Circle();
if (shape instanceof Circle c) {
System.out.println("It's a circle.");
}
}
}
2. Records(预览版延续)(JEP 384)
记录类提供了一种更为简洁的方式来定义不可变数据类。
record Person(String name, int age) {}
public class RecordsDemo {
public static void main(String[] args) {
Person person = new Person("Alice", 30);
System.out.println(person);
}
}
3. 文本块(第二次预览)(JEP 368)
文本块提供了多行字符串文字,可以保留格式和缩进。
public class TextBlocksDemo {
public static void main(String[] args) {
String html = """
<html>
<body>
<p>Hello, World!</p>
</body>
</html>
""";
System.out.println(html);
}
}
4. Hidden Classes(孵化器特性)(JEP 371)
隐藏类允许创建仅对创建它的类加载器可见的类。
import java.lang.invoke.MethodHandles.Lookup;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
public class HiddenClassDemo {
public static void main(String[] args) throws Exception {
Lookup lookup = MethodHandles.lookup();
Class<?> hiddenClass = lookup.defineHiddenClass(
new byte[]{...}, // 字节码数组
true, // 是否公开
Object.class // 直接超类
).lookupClass();
Object instance = hiddenClass.getDeclaredConstructor().newInstance();
System.out.println(instance.getClass());
}
}
5. Edwards-Curve Digital Signature Algorithm(EdDSA)(JEP 339)
引入了EdDSA作为新的数字签名算法。
import java.security.KeyPairGenerator;
import java.security.Signature;
import java.security.SignatureException;
public class EdDSADemo {
public static void main(String[] args) throws Exception {
KeyPairGenerator kpg = KeyPairGenerator.getInstance("EdDSA");
var keyPair = kpg.generateKeyPair();
var signature = Signature.getInstance("EdDSA");
signature.initSign(keyPair.getPrivate());
var message = "Hello, EdDSA!".getBytes();
signature.update(message);
byte[] signedMessage = signature.sign();
// Verify
signature.initVerify(keyPair.getPublic());
signature.update(message);
boolean isValid = signature.verify(signedMessage);
System.out.println("Signature is valid: " + isValid);
}
}
6. 外部内存访问API(孵化器特性)(第二次孵化)(JEP 370)
允许Java程序安全高效地访问Java堆外的内存。
import jdk.incubator.foreign.MemorySegment;
public class ForeignMemoryAccessDemo {
public static void main(String[] args) {
MemorySegment segment = ...; // 分配或映射内存段
long value = segment.get(JAVA_LONG, 0); // 读取长整型
segment.set(JAVA_LONG, 0, 42L); // 写入长整型
}
}