java中switch匹配枚举类型直接使用枚举常量简单名称,java 14+支持表达式语法并强制穷尽性检查,禁止用name()或ordinal()转换后匹配。

Java 中 switch 匹配枚举类型非常直接,不需要额外转换或 toString(),只需确保 case 标签使用枚举常量的**简单名称**(不带类名),且 switch 表达式类型与枚举类型一致即可。
基本写法:直接用枚举常量作 case
假设有一个枚举 Day:
switch 写法如下:
switch (today) {
case MONDAY:
System.out.println("周一开工");
break;
case FRIDAY:
System.out.println("周五快乐");
break;
default:
System.out.println("工作日中...");
}
Java 14+ 支持 switch 表达式(推荐)
可省略 break,返回值更清晰:
String result = switch (today) {case MONDAY, TUESDAY, WEDNESDAY, THURSDAY -> "工作日";
case FRIDAY -> "准周末";
case SATURDAY, SUNDAY -> "休息日";
};
- 多个枚举值可用逗号分隔,共享同一个分支逻辑
- 必须覆盖所有枚举常量,或显式写 default,否则编译报错(穷尽性检查)
- 如果漏掉某个枚举值又没写 default,Java 17+ 会提示编译错误
注意事项
- case 后面只写枚举常量名(如 MONDAY),不要加
Day.MONDAY,否则编译失败 - switch 表达式变量类型必须是该枚举类型,不能是 String 或 int(除非手动转换,但不推荐)
- 枚举类里定义的字段、方法不影响 switch 语法,switch 只匹配枚举实例本身
- IDE(如 IntelliJ)通常会自动补全所有 case 分支,有助于避免遗漏
不推荐的写法(易出错)
以下方式虽然能运行,但违背 switch 设计初衷,也不安全:
// ❌ 错误:把枚举转成字符串再 switchswitch (today.name()) { ... } // 失去类型安全,name() 可能为空或被反射篡改
// ❌ 错误:用 ordinal()
switch (today.ordinal()) { ... } // 一旦枚举顺序调整,逻辑就崩了
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











