Java 16 的新特性(简版)
JDK 16在2021年3月16日正式发布,虽然它不是长期支持(LTS)版本,但带来了许多新特性和改进。以下是JDK 16的主要新特性:
1. instanceof的模式匹配 (正式发布)
参考链接:https://openjdk.org/jeps/394
改进的instanceof在JDK 14和JDK 15中作为预览特性引入,最终在JDK 16中确定。它允许在instanceof
检查的同时声明一个新的变量,并且这个变量的类型是被检查对象的类型(如果instanceof
检查成功的话)。这个特性简化了代码,减少了类型转换的需要,并提高了代码的可读性。
例子:
public class InstanceOfPatternMatchingDemo {
public static void main(String[] args) {
Object obj = "Hello, World!";
// 使用传统的instanceof检查和类型转换
if (obj instanceof String) {
String str = (String) obj;
System.out.println(str.toUpperCase());
}
// 使用Java 16的instanceof模式匹配
if (obj instanceof String s) {
// s的类型已经被推断为String,无需再次转换
System.out.println(s.toUpperCase());
}
// 也可以用在更复杂的表达式中
Object obj2 = 123;
if (obj2 instanceof Integer i && i > 100) {
// i的类型已经被推断为Integer,并且可以直接使用
System.out.println("The number is: " + i);
}
// 嵌套类型检查
Object obj3 = new ArrayList<String>() {{
add("Apple");
add("Banana");
}};
if (obj3 instanceof List<?> list && !list.isEmpty()) {
// list的类型被推断为List<?>,可以直接使用
System.out.println("The list contains: " + list.get(0));
}
}
}
2. 记录(Records)(正式发布)
参考链接:https://openjdk.org/jeps/395
记录(Records)它提供了一种简洁的方式来声明不可变的类,主要用于作为数据的透明载体。记录类自动实现了equals
、hashCode
和toString
方法,并且所有的字段都是final
的,即不可变的。
例子:
// 定义一个名为Person的记录
public record Person(String name, int age) {
// 你可以在这里添加方法,但通常记录是设计为不可变的,并且只包含数据
// 示例:添加一个方法计算年龄是否是成年人
public boolean isAdult() {
return age >= 18;
}
// 注意:你不能添加字段,因为记录的所有字段都是在声明时指定的
// 你也不能覆盖equals、hashCode或toString方法,因为记录已经为你做了这些
// 你可以有静态方法、静态字段等,但这不是记录的主要用途
public static void main(String[] args) {
// 创建Person记录的一个实例
Person alice = new Person("Alice", 30);
// 使用记录的自动生成的toString方法
System.out.println(alice); // 输出类似:Person[name=Alice, age=30]
// 访问记录的字段(通过编译器生成的访问器方法)
System.out.println("Name: " + alice.name()); // 注意这里使用name()来访问字段
System.out.println("Age: " + alice.age());
// 使用自定义方法
System.out.println("Is Alice an adult? " + alice.isAdult());
// 尝试修改记录的字段(这将导致编译错误,因为字段是final的)
// alice.name = "Bob"; // 编译错误
// 由于记录是不可变的,你不能改变其状态,但你可以创建新的记录实例
Person olderAlice = new Person(alice.name(), alice.age() + 1);
System.out.println(olderAlice); // 输出类似:Person[name=Alice, age=31]
}
}
3. 其他更新
ZGC的并发线程堆栈处理(JEP 376)
Elastic Metaspace(JEP 387)
jpackage工具(JEP 392)
外部链接程序API(JEP 389)
外部存储器访问API(JEP 393)
评论区