Java 14起switch表达式成为标准特性,JDK 17增强类型模式匹配;它返回值、用->替代:和break、支持多值合并、块内yield返回、强制穷尽检查,并天然避免fall-through错误。

Java 14 起 switch 表达式正式成为标准特性,JDK 17 进一步完善并稳定使用。它不再是只能执行语句的“开关块”,而是能直接返回值的表达式,写法更紧凑、逻辑更清晰、错误更少。
基础用法:箭头分支直接返回值
用 -> 替代传统 : 和 break,每个分支自动 yield 单个表达式结果:
- 字符串、枚举、整型常量都支持
- 多个 case 值可用逗号并列,语义等价于“或”关系
- 不需要 break,天然避免 fall-through 错误
例如:
case MON, TUE, WED, THU, FRI -> "weekday";
case SAT, SUN -> "weekend";
default -> "unknown";
};
复杂逻辑:块分支 + yield 显式返回
当一个分支需要多行代码(如日志、计算、条件判断),要用 { } 包裹,并在最后用 yield 明确返回值:
- yield 是必须的,漏写会编译失败
- yield 后面可以是变量、表达式或方法调用
- 块内可定义局部变量,作用域仅限该分支
例如:
int days = switch (month) {case APRIL, JUNE, SEPTEMBER, NOVEMBER -> 30;
case FEBRUARY -> {
if (isLeapYear) yield 29;
else yield 28;
};
default -> 31;
};
类型模式匹配:替代 instanceof + 强转
JDK 17 支持用类型名直接做 case,自动完成类型检查与变量绑定(需确保 selector 类型足够宽泛,如 Object):
- case String s ->:s 已是非 null 的 String,可直接用
- case Integer i ->:i 是已拆箱的 int,不是 Integer 对象
- 必须显式处理 null,否则编译不通过(如加 case null -> ...)
- 支持 when 子句追加运行时条件,如 case String s when s.length() > 5 ->
例如:
String desc = switch (obj) {case String s -> "string: " + s;
case Integer i -> "number: " + i * 2;
case null -> "null received";
default -> "other object";
};
穷尽性要求:尤其注意枚举和密封类
编译器会强制检查是否覆盖所有可能取值:
- switch 枚举时,必须列出全部常量,或带 default 分支
- switch 密封类(sealed class)时,必须覆盖所有 permitted 子类,否则报错
- 普通类或 Object 类型无此限制,但 null 必须单独处理
例如(枚举):
String name = switch (color) {case RED -> "红色";
case GREEN -> "绿色";
case BLUE -> "蓝色";
// 缺少 YELLOW 或 default → 编译失败
};


















