jdk 22 正式支持模式匹配 for switch 并深度集成密封类,实现编译期穷尽性检查;密封类通过 sealed/permits 明确子类型边界,配合 record 可直接解构,使 switch 表达式安全、简洁、可扩展。

Java 的模式匹配与密封类正逐步融合,成为提升类型安全与代码简洁性的核心机制。JDK 17 引入密封类(Sealed Classes),JDK 19/21 分阶段增强模式匹配(Pattern Matching),而 JDK 22(2024 年 3 月正式发布)已将 模式匹配 for switch 转为正式特性,并深度支持对密封类的穷尽性检查——这意味着编译器能静态验证 switch 表达式是否覆盖了密封类的所有允许子类型。
密封类是模式匹配的理想搭档
密封类通过 sealed、permits 明确限定直接子类,消除了“未知子类型”的不确定性。这为模式匹配提供了编译期可推导的类型边界:
- 当对一个密封类引用进行
switch模式匹配时,若列出了所有允许的子类(且无default),编译器确认逻辑穷尽,允许返回值(即 switch 成为表达式); - 若遗漏某个子类,编译器报错,而非静默落入
default——这在传统 instanceof + cast 链中极易被忽略; - 结合
record使用效果更佳:每个子类天然不可变、具名解构,可直接用case SubType(int x, String y) -> ...提取数据。
从 instanceof 到 switch 模式匹配的典型演进
过去处理密封类层次需冗长的类型判断:
if (shape instanceof Circle c) {
return Math.PI * c.radius() * c.radius();
} else if (shape instanceof Rectangle r) {
return r.width() * r.height();
} else if (shape instanceof Square s) {
return s.side() * s.side();
} else {
throw new IllegalStateException("Unknown shape: " + shape);
}
现在可简洁、安全、可扩展地表达:
新写法(编译检查 + 解构一体化):return switch (shape) {
case Circle(double r) -> Math.PI * r * r;
case Rectangle(int w, int h) -> w * h;
case Square(int s) -> s * s;
}; // 无 default,且 Circle/Rectangle/Square 已是 CircleShape 的全部 permitted 子类 → 编译通过
关键约束与实用提醒
要让这种组合真正发挥效力,需注意几个实际落地要点:
- 密封类必须显式声明
permits,且所有子类必须在同一个模块(或同一编译单元)中声明,否则编译器无法验证穷尽性; - switch 中的模式必须是最终类型(final 或隐式 final),不能是抽象类或接口——密封类本身可以是 abstract,但其 permitted 子类必须是具体可实例化的;
- 若未来新增子类,所有依赖该密封类的 switch 表达式会立即编译失败,迫使开发者主动适配,这是“失败即反馈”的设计优势;
- IDE(如 IntelliJ IDEA 2023.3+)已支持自动补全缺失 case 分支,大幅提升开发效率。
这不是终点,而是类型导向编程的起点
Java 正借由密封类 + 模式匹配构建更可靠的代数数据类型(ADT)体验。下一步演进可能包括:对泛型密封类的更深层模式支持、嵌套模式(如 case Node(Node left, Node right))、以及与 record pattern、array pattern 的进一步统一。这些并非语法糖,而是让类型系统真正参与逻辑校验的底层能力升级。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











