Java枚举可直接用于switch,语法简洁、类型安全且编译期检查分支覆盖;需规范定义枚举类,case后直接写常量名;注意null安全,推荐判空或用Optional;IDE和-Xlint:switch可提示遗漏分支。

Java 中枚举类可以直接用于 switch 语句,语法简洁、类型安全,且编译期就能检查所有分支是否覆盖(配合 default 或 IDE 提示可避免遗漏)。
枚举定义要规范
确保枚举类是标准形式,每个常量是独立的实例:
- 用
public enum声明,推荐放在单独文件或类内顶部 - 枚举常量之间用逗号分隔,末尾可加分号(有方法或字段时必需)
- 不建议在枚举中混用抽象方法和具体实现,除非明确需要多态行为
例如:
public enum Status {
PENDING,
APPROVED,
REJECTED,
CANCELLED
}
switch 中直接写枚举常量名
不用加类名前缀,也不用调用 name() 或 ordinal() —— Java 编译器自动识别枚举类型并匹配常量:
立即学习“Java免费学习笔记(深入)”;
- case 后直接写
PENDING、APPROVED等,不带Status.前缀 - case 值必须是该枚举的编译期常量,不能是变量或表达式
- 从 Java 14 起,
switch表达式也支持枚举(用->和yield)
示例:
Status status = Status.APPROVED;
switch (status) {
case PENDING -> System.out.println("待处理");
case APPROVED -> System.out.println("已通过");
case REJECTED -> System.out.println("被拒绝");
case CANCELLED -> System.out.println("已取消");
}
注意 null 安全和 default 处理
枚举变量可能为 null,而 switch 遇到 null 会直接抛 NullPointerException:
- 要么在 switch 前判空,比如
if (status != null) { ... } - 要么在 switch 内用
default捕获异常情况(但无法捕获 null) - 更稳妥的方式:用传统 if-else 或 Optional 封装再处理
IDE 和编译器能帮你查漏
现代 IDE(如 IntelliJ)会在 switch 缺少某个枚举常量时标黄提示;启用编译选项 -Xlint:switch 也能警告未覆盖的枚举分支:
- 如果未来新增枚举值,已有 switch 未更新,编译时可能无报错,但运行时走 default 或逻辑出错
- 配合 sealed class + switch(Java 17+)可进一步强化 exhaustiveness 检查


















