java记录模式是jdk 21+编译器支持的类型安全解构机制,要求嵌套结构全为record、字段顺序类型严格匹配,支持if/swtich中多层解构、部分提取(_占位)、守卫条件(when)及null/类型自动校验。

Java记录模式(Record Patterns)让嵌套对象的解构变得直观、安全且无需手动判空或强转——它不是语法糖,而是编译器层面支持的类型安全提取机制,适用于JDK 21+(正式特性)及JDK 22增强版。
嵌套记录模式:一层套一层,字段直取
只要嵌套结构由记录类(record)构成,就能用圆括号嵌套写法逐层解构。编译器自动插入非空检查和类型校验,避免NPE和ClassCastException。
- 定义层级结构:比如
record Address(String city, String street){}、record Person(String name, Address addr){}、record Order(int id, Person buyer){} - 一次性解构:
if (obj instanceof Order(int id, Person(String name, Address(String city, String street)))) {<br> System.out.printf("Order %d: %s in %s, %s%n", id, name, city, street);<br>} - 支持部分解构:可只提取某几层,未写的字段用下划线
_占位,例如Order(_, Person(_, Address(String c, _)))提取城市即可
与switch结合:多分支嵌套匹配更清晰
在switch表达式或语句中使用记录模式,能替代冗长的if-else链,尤其适合处理多种嵌套组合。
- 示例:区分不同类型的几何形状并解构其坐标
return switch (shape) {<br> case Circle(Point(double cx, double cy), double r) -> String.format("Circle at (%.1f,%.1f), r=%.1f", cx, cy, r);<br> case Rectangle(Point(double x1, double y1), Point(double x2, double y2)) -> ...<br> default -> "Unknown shape";<br>};- 每个case都可独立解构,变量作用域限于该分支,不会污染外部
混合传统模式:与类型模式、守卫条件协同使用
记录模式可和普通类型检查、布尔守卫(when)组合,实现带逻辑约束的精准解构。
- 例如:只对半径大于0的圆执行操作
if (obj instanceof Circle(Point(int x, int y), double r) when r > 0) {<br> // 安全使用 x, y, r<br>}- 也可嵌入泛型记录,如
Result<string>(String value, Throwable error)</string>,解构时保留类型信息:result instanceof Result<string>(String v, null)</string> - 注意:守卫条件在解构成功后才求值,因此v、r等变量在when中已可用
注意事项与避坑点
记录模式强大但有明确前提,用错场景反而增加复杂度。
- 仅对record类生效——普通class、Map、List不支持;若数据来自JSON或数据库映射,需先转为record实例
- 字段名必须与record定义严格一致,大小写敏感,且不能跳过中间层(如想从Order直接取Address.city,必须写出Person层)
- 嵌套过深(超过4–5层)会降低可读性,建议拆分为多个小record或配合方法封装
- JDK 21需启用预览特性:
--enable-preview --source 21;JDK 22起默认启用,但仍建议显式指定源版本
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











