java 21正式支持记录模式,可在instanceof和switch中直接解构record字段,自动绑定变量并编译期校验类型、顺序与数量,仅限record类型且支持嵌套、守卫及下划线忽略字段。
java 14 引入了模式匹配的预览功能,到 java 16 正式支持 instanceof 模式匹配,而记录类(record)的解构(deconstruction)能力在 java 21 中通过“模式匹配 for switch”和“记录模式(record patterns)”正式落地——这是实现字段提取的核心机制。
记录模式:直接在模式中解构 record 字段
记录类天然具备不可变性和规范构造函数,因此 Java 允许用“记录模式”在 switch 或 if 的 instanceof 中直接绑定字段值,无需手动调用 getter。
例如:
record Point(int x, int y) {}
record Circle(Point center, double radius) {}
Object shape = new Circle(new Point(3, 4), 5.0);
// ✅ 使用记录模式解构嵌套 record
if (shape instanceof Circle(Point(var x, var y), double r)) {
System.out.println("Circle at (" + x + ", " + y + ") with radius " + r);
// 输出:Circle at (3, 4) with radius 5.0
}
这里 Point(var x, var y) 就是记录模式:它自动调用 Point 的规范构造函数语义(即匹配其组件),并将字段值分别绑定到局部变量 x 和 y。Java 编译器会验证该类型是否为 record,并确保字段名、类型、顺序一致。
嵌套与组合:多层解构更简洁
记录模式支持任意深度嵌套,也可与类型模式、守卫(when)结合,让逻辑更清晰、安全。
- 无需临时变量或显式转型
- 编译期检查字段数量/类型/顺序,错误在编译时报出
- 可混合使用:如
Circle(Point(int x, int y), var r)显式指定类型,或var让编译器推断 - 支持守卫:
if (shape instanceof Circle(Point(var x, var y), double r) && x > 0 && y > 0)
在 switch 表达式中使用记录模式
Java 21+ 支持在 switch 中直接使用记录模式分支,进一步提升表达力:
String describe(Object o) {
return switch (o) {
case Circle(Point(int x, int y), double r) ->
String.format("Circle(%d,%d), r=%.1f", x, y, r);
case Point(int x, int y) ->
String.format("Point(%d,%d)", x, y);
case null -> "null";
default -> "unknown";
};
}
每个 case 都是独立的模式:匹配成功时自动解构,并将字段绑定到该分支作用域内的局部变量,作用域严格受限,避免命名污染。
注意事项与限制
- 仅适用于
record类型;普通 class 不支持记录模式(即使有 getter 也不行) - 字段必须按声明顺序出现;跳过某个字段需用下划线
_(Java 21+ 支持,如Point(int _, int y)) - 不能解构继承自父 record 的字段(record 不支持继承)
- 若 record 字段是泛型(如
record Box<t>(T value)</t>),模式中可用Box(var value),但无法在模式中写出具体类型参数(类型擦除限制)
记录模式不是语法糖,而是 JVM 层面增强的模式匹配能力,它让数据载体类的解包变得安全、简洁、可读性强。只要你的数据建模使用 record,就能零成本享受字段级的结构化匹配。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











