java switch模式匹配将类型检查、强转和变量使用合并为一步,支持类型模式、守卫条件、null处理及record解构,提升安全性与简洁性。

Java 中 switch 语句利用模式匹配简化类型判断,核心是把“检查类型 + 强制转换 + 使用变量”三步合并为一步,在 case 中直接声明带类型的模式变量,既安全又简洁。
类型模式:替代 instanceof + 强转
传统写法需先判断再强转,容易出错且啰嗦:
- if (obj instanceof String) { String s = (String) obj; ... }
- 重复写类型、漏括号、类型不一致都可能引发运行时异常
Java 17+ 支持在 case 后直接写 类型 变量名,自动完成类型校验与绑定:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- case String s -> System.out.println(s.length());
- case Integer i -> System.out.println(i * 2);
- 变量 s 和 i 在该分支内直接可用,编译器确保非 null 且类型准确
支持守卫条件(when 子句)
可在类型匹配基础上追加逻辑判断,避免嵌套 if:
- case Double d when d > 0 -> System.out.println("正浮点数");
- case List> list when !list.isEmpty() -> process(list);
- 守卫条件只在类型匹配成功后执行,语义清晰、不易出错
null 和 default 的显式处理
switch 模式匹配天然支持 null 分支,无需额外空指针防护:
- case null -> throw new IllegalArgumentException("输入为空");
- default -> throw new UnsupportedOperationException("不支持类型: " + obj.getClass());
- 缺省分支必须显式覆盖,否则遇到未定义类型会抛 MatchException,强制兜底意识
Java 21 起:记录模式解构嵌套结构
当对象是 record 类型时,case 可直接解构字段,跳过 getter 调用:
- record User(String name, int age) {}
- case User(String n, int a) when a >= 18 -> greet(n);
- 更深层嵌套也支持:case User(String n, Address(String city, String zip)) -> ...
- 字段名可省略为 _(Java 22 预览),仅需提取部分字段时更干净
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










