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); // 写入长整型
    }
}