Java 16 新特性及具体应用
目录
Java 16(2021 年 3 月) 新特性及代码示例
1. 记录类(Records)
2. instanceof 模式匹配
3. 密封类(Sealed Classes)
4. Vector API(孵化器)
5. Unix域套接字通道
6. 打包工具(jpackage)
其他重要特性
Java 16(2021 年 3 月) 新特性及代码示例
1. 记录类(Records)
正式成为标准特性,用于简化不可变数据载体的声明。
应用场景:DTO、配置对象、纯数据模型
public record User(String name, int age) { }public class Main {public static void main(String[] args) {User user = new User("Alice", 30);System.out.println(user.name()); // 输出: AliceSystem.out.println(user); // 输出: User[name=Alice, age=30]}
}
特点:
- 自动生成
equals()
、hashCode()
、toString()
- 隐式
final
类,字段为private final
2. instanceof
模式匹配
正式成为标准特性,消除冗余的类型转换。
应用场景:类型检查与安全转换
public class PatternMatchingExample {public static void main(String[] args) {Object obj = "Java 16";// 传统写法if (obj instanceof String) {String s = (String) obj;System.out.println(s.length());}// Java 16 模式匹配if (obj instanceof String s) {System.out.println(s.length()); // 直接使用变量 s}}
}
3. 密封类(Sealed Classes)
(预览特性) 控制类的继承层次。
应用场景:限制接口/类的实现
// 定义密封接口
public sealed interface Shape permits Circle, Rectangle {double area();
}// 允许的子类
public final class Circle implements Shape {private final double radius;public Circle(double r) { radius = r; }@Override public double area() { return Math.PI * radius * radius; }
}public final class Rectangle implements Shape {private final double w, h;public Rectangle(double w, double h) {this.w = w; this.h = h;}@Override public double area() { return w * h; }
}
4. Vector API(孵化器)
(JEP 338) 利用硬件SIMD指令加速向量计算。
应用场景:科学计算、机器学习
import jdk.incubator.vector.*;public class VectorExample {public static void main(String[] args) {var species = FloatVector.SPECIES_256;float[] a = new float[1024];float[] b = new float[1024];float[] c = new float[1024];// 向量化计算: c = a + bfor (int i = 0; i < a.length; i += species.length()) {var va = FloatVector.fromArray(species, a, i);var vb = FloatVector.fromArray(species, b, i);var vc = va.add(vb);vc.intoArray(c, i);}}
}
5. Unix域套接字通道
(JEP 380) 支持进程间高效通信。
应用场景:本地服务通信
import java.nio.channels.*;
import java.nio.file.*;public class UnixSocketExample {public static void main(String[] args) throws Exception {var socketPath = Path.of("/tmp/app.sock");// 服务端var server = ServerSocketChannel.open(StandardProtocolFamily.UNIX);server.bind(UnixDomainSocketAddress.of(socketPath));// 客户端var client = SocketChannel.open(StandardProtocolFamily.UNIX);client.connect(UnixDomainSocketAddress.of(socketPath));}
}
6. 打包工具(jpackage
)
(JEP 392) 生成原生安装包。
终端命令示例:
# 生成可执行程序
jpackage --name MyApp --input lib --main-jar app.jar# 生成平台特定安装包 (e.g., .dmg/.msi)
jpackage --name MyApp --type pkg --input lib --main-jar app.jar
其他重要特性
特性 | 说明 |
---|---|
Stream.toList() | 替代 collect(Collectors.toList()) |
Day Period Support | 日期格式支持 "上午/下午" |
弹性元空间(Metaspace) | 优化内存回收机制 |
// Stream.toList() 示例
List<String> filtered = items.stream().filter(s -> s.length() > 3).toList(); // Java 16 新方法