Java中switch处理枚举天然安全可读:直接用无限定常量名作case标签,编译器检查全覆盖,推荐加default防新增遗漏;错误写法如case Status.PENDING不合法。

Java 中用 switch 处理枚举类型非常自然、安全且可读性强——编译器会检查是否覆盖所有枚举常量(配合 default 或 sealed 可进一步增强健壮性)。
直接用枚举常量作为 case 标签
不需要调用 name() 或 toString(),直接写枚举类中的常量名即可。Java 从 JDK 5 起就支持枚举与 switch 的原生结合。
示例:
enum Status { PENDING, APPROVED, REJECTED }
Status status = Status.APPROVED;
switch (status) {
case PENDING:
System.out.println("等待处理");
break;
case APPROVED:
System.out.println("已批准");
break;
case REJECTED:
System.out.println("已拒绝");
break;
}
推荐加上 default 分支(尤其非 sealed 枚举)
即使当前枚举只有三个值,未来新增常量时若忘记更新 switch,缺少 default 会导致逻辑静默遗漏。加 default 能提前暴露问题。
- 可以抛出
AssertionError或IllegalArgumentException,明确表示“此处不应到达” - 如果枚举是
sealed(JDK 17+),且switch已穷举所有子类型,编译器可推断无需default;但保留仍是一种防御习惯
避免在 case 中重复写枚举类名
错误写法:case Status.PENDING: —— 这在语法上不合法。case 标签必须是**无限定的枚举常量名**。
正确写法只有:case PENDING:(前提是 switch 表达式类型是 Status,编译器能推断作用域)。
如果 IDE 提示 “cannot resolve symbol”,常见原因是:
- 枚举类型和 switch 变量类型不匹配(比如变量是
Object或String) - 导入缺失或拼写错误(如写了
PENDNG)
进阶:配合 record 和 sealed 提升类型安全
若枚举承载行为差异较大,可考虑用 sealed interface + 具体 record 实现,再用 switch 模式匹配(JDK 21+ preview,或正式版中使用 instanceof + 类型模式)。
但对大多数状态分发场景,传统枚举 + switch 已足够简洁可靠——没有运行时反射开销,编译期检查完整,IDE 支持补全和跳转也最成熟。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











