Skip to content

枚举与 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...
    }
}

注意事项

  1. 穷尽检查:编译器确保所有枚举值都有对应 case
  2. 不需要 break:箭头语法不会 fall-through
  3. JDK 14+ 箭头语法:推荐使用,更简洁
  4. yield 关键字:在 switch 表达式中返回值(不是 break)
  5. default 分支:如果未来可能扩展枚举值,保留 default

基于 VitePress 构建