Java 14/16 record类与instanceof模式匹配
请详细解释Java 14(Preview)/Java 16(正式)引入的record类和instanceof模式匹配。record类如何简化不可变数据载体的定义?模式匹配如何简化类型检查和强制类型转换?
回答
屠龙少年
Record类(Java 14 Preview,Java 16正式)
定义:一种不可变数据载体,自动生成构造方法、equals()、hashCode()、toString()、getter(非传统getXxx,而是组件名方法)。
// 传统POJO需要大量样板代码
public record Point(int x, int y) {}
// 相当于自动生成了:
// private final int x;
// private final int y;
// public Point(int x, int y)
// public int x()
// public int y()
// equals() / hashCode() / toString()
// 可添加自定义方法
public record Range(int start, int end) {
public Range {
if (start > end) throw new IllegalArgumentException(); // 紧凑构造方法
}
public int length() { return end - start; }
}
限制:
- 不可继承/被继承(隐式final)
- 字段隐式为private final
- 不能添加实例字段(可添加静态字段和方法)
instanceof模式匹配(Java 14 Preview,Java 16正式)
简化类型检查+强制转换:
// 传统写法
if (obj instanceof String) {
String s = (String) obj;
System.out.println(s.length());
}
// 模式匹配写法
if (obj instanceof String s) {
System.out.println(s.length()); // s已经绑定为String类型
}
// 与条件运算符结合
if (obj instanceof String s && s.length() > 5) { ... }
// 注意:不能用 ||,因为||中s可能未绑定
优势:消除冗余的类型转换代码,减少错误。