枚举 switch 中 case 应直接写常量名(如 red),勿加类名前缀;必须包含 default 分支以保障穷举安全;java 14+ 表达式语法不变,仍需覆盖所有值;勿盲目听从 ide 将 switch 转 if 的提示。

switch-case 里直接写枚举常量,别加类名前缀
Java 编译器在 switch 的 case 分支中能自动推导枚举类型,所以 case RED: 合法,case Color.RED: 反而报错(除非用了静态导入且上下文模糊)。常见错误是照着 IDE 自动补全习惯写全限定名,结果触发 error: constant expression required。
实操建议:
- 确保
switch表达式的类型和case常量属于同一个枚举类 - 不要手动加枚举类名,比如
Color.RED—— 除非你在 switch 外部用了同名不同枚举的变量,那得靠作用域或重命名规避 - 如果 IDE 提示“cannot resolve symbol”,先检查枚举是否被正确 import,而不是硬加前缀
default 分支不是可选的,但编译器不强制要求
Java 允许 switch 枚举不写 default,但一旦新增枚举值而没同步更新 case,运行时就直接掉进「没匹配到」的静默失败。这不是编译错误,而是逻辑漏洞。
实操建议:
- 所有处理枚举的
switch都必须带default,哪怕只是抛异常:default -> throw new IllegalArgumentException("Unexpected color: " + color); - 用
enum+switch的本意是穷举,漏掉default就等于放弃类型安全优势 - 如果真想忽略某些值,显式写出所有已知 case,再在
default里 log 或 assert,别留空
Java 14+ 支持 switch 表达式,但枚举 case 语法没变
从 Java 14 开始可以用 switch 表达式(带 -> 和返回值),但枚举的匹配规则和老式语句式完全一致。有人误以为新语法要改写法,比如加括号或类型标注,其实不用。
实操建议:
- 新写法:
String name = switch (color) { case RED -> "red"; case GREEN -> "green"; default -> "unknown"; }; - 旧写法仍可用,但表达式更简洁、无 break 穿透风险
- 注意:表达式必须覆盖所有可能值(含
default),否则编译失败 —— 这反而是个保护机制 - 别在表达式里混用
:和->,语法不兼容
IDEA 提示 “Switch can be replaced with ‘if’” 时别盲目点
IntelliJ 有时对单个或两个 case 的枚举 switch 推荐转成 if,理由是“更高效”。但这是误导:枚举 switch 底层编译为 tableswitch/lookupswitch,性能通常优于链式 if;更重要的是,它保留了可维护性 —— 新增枚举值时编译器会立刻提醒你补 case。
实操建议:
- 只要枚举值 ≥ 2 且未来可能扩展,就坚持用
switch,无视该提示 - 如果真只有 1 个 case 且确定永不扩展,那用 if 也行,但这种情况极少
- 检查项目是否启用了
java.compiler.switch.enum.exhaustiveness类似检查(如 Error Prone),比 IDE 提示更可靠
default、不手抖加类名、不被 IDE 建议带偏 —— 这些地方一松懈,bug 就藏进字节码里,等上线才冒头。Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











