Java switch原生支持枚举,需直接传枚举变量、case只写常量名;推荐用Java 14+ switch表达式,强制覆盖所有值;注意null安全,建议先判空;配合IDE提示、编译警告和单元测试提升可靠性。

Java 中 switch 语句原生支持枚举类型,用法简洁、类型安全,且能借助编译器做静态检查,避免遗漏分支。
直接传入枚举变量,case 写常量名
switch 表达式必须是枚举类型的变量(如 Status status),不能是 status.name() 或 status.ordinal()。case 后只写枚举常量名,不加类名前缀:
- ✅ 正确:
case PENDING:、case APPROVED: - ❌ 错误:
case Status.PENDING:(编译报错:constant expression required) - ❌ 错误:
case "PENDING":(类型不匹配,退化为字符串判断)
推荐用 switch 表达式(Java 14+)
新语法更安全,无穿透风险,且编译器强制覆盖所有枚举值:
- 每个 case 用
->,自动终止,不用break - 必须显式处理所有枚举常量,缺一个就编译失败
- 示例:String msg = switch(status) { case PENDING -> "待处理"; case APPROVED -> "已通过"; default -> "未知状态"; };
null 安全和 default 分支要谨慎
枚举变量可能为 null,直接 switch 会抛 NullPointerException:
- 建议先判空:
if (status != null) { switch(status) { ... } } - default 不是“兜底万能项”:它无法捕获 null,也不能掩盖新增枚举值被忽略的风险
- 内部逻辑中,可不写 default,靠编译报错驱动补全;若必须兼容未知输入,default 中应抛异常或明确记录
配合工具提升可靠性
光靠语法不够,需工程手段加固:
- IDE(如 IntelliJ)会标黄提示缺失的 case,开启自动补全提示
- 编译时加参数
-Xlint:switch,对传统 switch 发出遗漏警告 - 单元测试遍历
MyEnum.values(),断言每个值都能命中对应分支


















