Java从JDK14起逐步引入模式匹配,JDK21全面支持,将类型检查与变量绑定合二为一,提升安全性与表达力;支持instanceof模式匹配、switch表达式多类型处理、when守卫条件及密封类穷尽性检查。

Java 从 JDK 14 开始逐步引入模式匹配,到 JDK 21 已全面支持,它能让分支逻辑中原本冗长、易错的类型检查 + 强制转换流程,变成一步完成的安全绑定。核心不是“多写几个 if”,而是用更贴近语义的方式让类型判断本身成为表达式的一部分。
用 instanceof 模式匹配替代手动类型转换
传统写法要先判断、再强转,两步分离容易漏判或写错类型:
if (obj instanceof String) { String s = (String) obj; return s.length(); }- 若 obj 是 null 或非 String,强转会抛
ClassCastException,且 IDE 不会提前警告
模式匹配把判断和绑定合为一步,变量 s 在作用域内天然非 null 且类型确定:
if (obj instanceof String s) { return s.length(); }- 编译器保证 s 可安全使用,无需额外空值检查(s 已是 String 实例)
- JDK 16 起正式支持,无需预览参数
用 switch 表达式统一处理多种类型
当对象可能属于多个类型时,switch 表达式比 if-else 链更清晰,也天然支持穷尽性检查:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
return switch (obj) { case String s -> s.length(); case Integer i -> i.toString().length(); case List> list -> list.size(); case null -> 0; default -> -1; };- 每个
case 类型 变量自动完成 instanceof 判断 + 类型解包(如 i 是 int 值,非 Integer 对象) - 必须显式处理
case null,否则编译失败——这是强制提升健壮性的设计 - JDK 17(预览)、JDK 21(正式)可用;需确保编译器启用对应版本(如
--source 21)
加 when 守卫条件细化分支逻辑
仅靠类型不够?比如“是字符串且长度大于 5”——这时用 when 子句补充运行时判断:
case String s when s.length() > 5 -> "long string"- 守卫条件只在类型匹配成功后执行,所以 s 已确定非 null,无需再写
s != null && - 多个条件可用
&&或||连接,但建议保持简单;复杂逻辑应抽成独立方法 - 注意:
when不影响编译期穷尽性检查,即使写了case String s when s.startsWith("A")和case String s,编译器仍认为所有 String 已覆盖
结合密封类实现真正穷尽分支
如果你控制输入类型(如用 sealed class 定义有限几种子类),模式匹配可配合编译器做全路径覆盖验证:
sealed interface Shape permits Circle, Rectangle, Triangle { }switch (shape) { case Circle c -> ...; case Rectangle r -> ...; case Triangle t -> ...; }- 如果漏写某个子类,编译直接报错;不需要靠测试或人工 review 来发现遗漏
- 加上
case null,整个分支就是编译期可验证的完整覆盖

















