JDK 21中引入的Nested Record Patterns(嵌套记录模式)是模式匹配特性的重要扩展,它允许开发者在instanceof模式匹配或者switch模式匹配中,直接嵌套子模式来解构多层嵌套的Record类型数据,避免了传统写法中多层判空、逐层获取字段的繁琐操作,让复杂数据模型的解构逻辑更加简洁清晰。

Nested Record Patterns 基础概念
Record是JDK 16引入的不可变数据载体类,本身支持模式匹配解构。当Record的字段本身也是Record类型,形成多层嵌套结构时,传统的解构方式需要逐层判断和转换,而Nested Record Patterns允许在一个模式匹配表达式中直接声明多层嵌套的模式,一次性完成所有层级的数据提取。
比如我们有一个用户地址的嵌套Record结构,用户Record包含地址Record,地址Record又包含城市信息,传统解构和嵌套模式解构的差异会非常明显。
传统解构方式的问题
假设我们有如下的嵌套Record定义:
// 定义城市Record
record City(String name, String code) {}
// 定义地址Record,包含城市字段
record Address(String detail, City city) {}
// 定义用户Record,包含地址字段
record User(String name, int age, Address address) {}
如果要获取一个User对象中的城市名称,传统的instanceof解构写法需要这样写:
public static String getCityNameTraditional(Object obj) {
if (obj instanceof User user) {
if (user.address() != null) {
Address address = user.address();
if (address.city() != null) {
City city = address.city();
return city.name();
}
}
}
return "未知城市";
}
可以看到传统写法需要多层null判断,代码嵌套层级深,可读性差,而且如果嵌套层级更多,代码会变得更加冗余。
使用 Nested Record Patterns 优雅解构
借助JDK 21的Nested Record Patterns,我们可以直接在instanceof的模式中嵌套子模式,一次性完成所有层级的解构:
public static String getCityNameNestedPattern(Object obj) {
if (obj instanceof User(String name, int age, Address(String detail, City(String cityName, String cityCode)))) {
return cityName;
}
return "未知城市";
}
上面的写法中,User(String name, int age, Address(String detail, City(String cityName, String cityCode)))就是嵌套记录模式,它直接声明了User、Address、City三层Record的解构模式,不需要额外的null判断(如果对象不符合模式匹配条件,会直接走到默认返回逻辑),代码简洁了很多。
在 switch 模式匹配中使用嵌套模式
Nested Record Patterns同样支持在switch的模式匹配中使用,适合需要根据不同嵌套结构做不同逻辑处理的场景:
public static String handleUserNested(User user) {
return switch (user) {
case User(String name, int age, Address(String detail, City(String cityName, String cityCode)))
when age >= 18 && "010".equals(cityCode) ->
name + "是北京成年用户";
case User(String name, int age, Address(String detail, City(String cityName, String cityCode)))
when age < 18 ->
name + "是未成年用户,所在城市:" + cityName;
case User(String name, int age, null) ->
name + "暂无地址信息";
default -> "未知用户类型";
};
}
这里在switch的分支中直接使用嵌套模式匹配,还可以结合when守卫条件做更精细的逻辑判断,比传统的switch写法灵活很多。
注意事项
- Nested Record Patterns仅支持Record类型的嵌套解构,普通Java类无法使用该特性,因为普通类没有固定的组件结构用于模式匹配。
- 如果嵌套结构中某层可能为null,需要在模式中显式声明null匹配分支,比如上面的
case User(String name, int age, null)就是匹配地址为null的情况。 - 嵌套模式的层级没有限制,但建议不要嵌套过深,否则模式表达式会过长,反而影响可读性,一般建议嵌套层级不超过3层。
总结
JDK 21的Nested Record Patterns为嵌套Record数据模型的解构提供了非常优雅的方案,大幅减少了样板代码,提升了代码的可读性。它尤其适合处理多层嵌套的不可变数据场景,比如API响应解析、数据转换等场景。开发者在使用时需要注意其仅支持Record类型的限制,合理设计嵌套层级,就能充分发挥这个特性的优势。
JDK_21Nested_Record_Patterns模式匹配Record类数据解构修改时间:2026-07-17 20:06:27