枚举与 switch
switch 语句最适合处理有限种情况,枚举恰好也是有限的固定值。两者结合,编译器会做穷尽检查——漏写任何一个 case,编译就会报错。
基本使用
java
public class EnumSwitchDemo {
enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
public static void main(String[] args) {
Day day = Day.MONDAY;
switch (day) {
case MONDAY:
case TUESDAY:
case WEDNESDAY:
case THURSDAY:
case FRIDAY:
System.out.println("Weekday");
break;
case SATURDAY:
case SUNDAY:
System.out.println("Weekend");
break;
}
}
}JDK 14+ 箭头语法
JDK 14 引入了 switch 表达式,语法更简洁:
java
public class SwitchArrowDemo {
enum Status {
PENDING, ACTIVE, SUSPENDED, DELETED
}
public static void main(String[] args) {
Status status = Status.ACTIVE;
// 箭头语法(无 fall-through)
String description = switch (status) {
case PENDING -> "待处理";
case ACTIVE -> "活跃";
case SUSPENDED -> "暂停";
case DELETED -> "已删除";
};
System.out.println(description);
}
}复杂逻辑(yield)
需要执行多行代码时,用 yield 返回值:
java
public class SwitchYieldDemo {
enum Operation {
ADD, SUBTRACT, MULTIPLY, DIVIDE
}
public static void main(String[] args) {
double a = 10, b = 3;
for (Operation op : Operation.values()) {
double result = switch (op) {
case ADD -> a + b;
case SUBTRACT -> a - b;
case MULTIPLY -> a * b;
case DIVIDE -> {
if (b == 0) yield 0;
yield a / b;
}
};
System.out.println(a + " " + op + " " + b + " = " + result);
}
}
}完整示例
java
public class CompleteSwitchDemo {
enum Operation {
ADD, SUBTRACT, MULTIPLY, DIVIDE
}
public static double calculate(double a, double b, Operation op) {
return switch (op) {
case ADD -> a + b;
case SUBTRACT -> a - b;
case MULTIPLY -> a * b;
case DIVIDE -> b != 0 ? a / b : 0;
};
}
public static void main(String[] args) {
System.out.println(calculate(10, 3, Operation.ADD)); // 13.0
System.out.println(calculate(10, 3, Operation.DIVIDE)); // 3.33...
}
}注意事项
- 穷尽检查:编译器确保所有枚举值都有对应 case
- 不需要 break:箭头语法不会 fall-through
- JDK 14+ 箭头语法:推荐使用,更简洁
- yield 关键字:在 switch 表达式中返回值(不是 break)
- default 分支:如果未来可能扩展枚举值,保留 default
