Java 14起引入switch表达式,Java 17+增强模式匹配,支持类型检查、解构和守卫条件,提升安全性、简洁性与可读性,需配合对应JDK版本使用。

Java 14 开始引入 switch 表达式(正式定稿于 Java 14),并在 Java 17+ 进一步支持 模式匹配(Pattern Matching),让 switch 不再只是“跳转语句”,而是能结合类型检查、解构、条件判断,显著简化多分支逻辑。关键不是“怎么写 switch”,而是“怎么用它更安全、更简洁、更表达意图”。
用 switch 表达式替代传统 switch 语句
传统 switch 需要 break 防止 fall-through,易出错;switch 表达式自动终止每个分支,返回值统一,代码更紧凑。
✅ 推荐写法(Java 14+):
String result = switch (obj) {
case String s -> "It's a string: " + s.length();
case Integer i -> "It's an int: " + (i * 2);
case null -> "Got null";
default -> "Unknown type";
};- 每个分支用
->,不需break - 分支可直接返回表达式,整个 switch 是一个表达式,可赋值
-
case null是合法且显式的,避免 NPE 隐患
结合类型模式(Type Patterns)做安全类型转换
不用先 instanceof 再强转,一步完成类型检查 + 变量绑定。
立即学习“Java免费学习笔记(深入)”;
❌ 旧写法:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
if (obj instanceof String) {
String s = (String) obj;
return s.toUpperCase();
} else if (obj instanceof Integer) {
Integer i = (Integer) obj;
return i.toString();
}✅ 新写法(Java 17+):
return switch (obj) {
case String s -> s.toUpperCase();
case Integer i -> i.toString();
case List<?> list -> String.valueOf(list.size());
default -> "unknown";
};-
case String s:既是类型检查,又把对象自动绑定为变量s - 编译器确保
s在该分支内非 null 且是 String 类型,无需额外判空或转型 - 支持任意引用类型(包括 record、sealed class 等)
配合 record 解构,展开数据结构
record 天然支持模式匹配解构,switch 中可直接“拆开” record 字段使用。
定义一个 record:
record Point(int x, int y) {}在 switch 中解构:
Object obj = new Point(3, 4);
String desc = switch (obj) {
case Point(int x, int y) -> "Point(%d, %d)".formatted(x, y);
case String s when s.length() > 5 -> "Long string: " + s;
case String s -> "Short string: " + s;
default -> "Other";
}; // → "Point(3, 4)"-
case Point(int x, int y)自动提取字段,无需调用 getter - 支持
when子句添加守卫条件(guard),增强分支精度 - 解构也适用于数组、枚举、甚至嵌套 record(如
case Person(String name, Address(addr)))
注意边界与兼容性
模式匹配 switch 功能分阶段演进,使用前确认 JDK 版本和编译选项:
- switch 表达式:Java 14(预览)、Java 14+ 正式支持(需启用
--enable-preview直到 Java 14 GA) - 类型模式(
case String s):Java 17(预览)、Java 21 正式稳定(推荐用 Java 21+) - record 解构模式:Java 21 正式支持
- 务必在
pom.xml或构建配置中指定source/target为对应版本,并开启预览特性(如需要)
不复杂但容易忽略——真正价值不在语法糖,而在于把运行时类型判断、空值处理、结构提取这些易错操作,交给编译器静态保障,让分支逻辑更可读、更健壮、更少 bug。

















