1. 什么是 switch 语句?

Java 中的 switch 语句是一种多分支选择结构,它根据表达式的值从多个候选分支中选择一个执行。相比于多个 if-else 语句,switch 在匹配固定值时更加清晰和高效。

2. 基本语法

Java 中 switch 语句的基本语法如下:

switch (expression) {
    case value1:
        // 当 expression 等于 value1 时执行的代码
        break;
    case value2:
        // 当 expression 等于 value2 时执行的代码
        break;
    // 可以有任意数量的 case 语句
    default:
        // 当 expression 不匹配任何 case 时执行的代码
}

关键点:

  • expression:可以是 byte、short、char、int、枚举(Java 5+)、String(Java 7+)以及包装类型。
  • case:每个 case 后面跟着一个常量值,用于与 expression 进行比较。
  • break:用于终止当前 case 的执行,防止“穿透”到下一个 case。
  • default:可选分支,当没有匹配的 case 时执行。

3. switch 的“穿透”现象

如果某个 case 分支中省略了 break 语句,程序会继续执行下一个 case 中的代码,直到遇到 break 或 switch 结束,这种现象称为“穿透”(fall-through)。

int day = 2;
switch (day) {
    case 1:
    case 2:
    case 3:
    case 4:
    case 5:
        System.out.println("工作日");
        break;
    case 6:
    case 7:
        System.out.println("周末");
        break;
    default:
        System.out.println("无效的天数");
}

上面的例子中,当 day = 2 时,由于 case 2 没有 break,会一直执行到 case 5 的代码,输出“工作日”。这种特性可以用于合并多个相同处理逻辑的 case。

4. Java 12+ 的增强 switch 表达式

从 Java 12 开始,switch 可以作为表达式使用,并且引入了更简洁的箭头语法(->)和 yield 关键字。

// 传统 switch 语句
String dayType;
switch (day) {
    case 1, 2, 3, 4, 5 -> dayType = "工作日";
    case 6, 7 -> dayType = "周末";
    default -> dayType = "未知";
}

// switch 表达式(Java 14+ 正式特性)
String dayType = switch (day) {
    case 1, 2, 3, 4, 5 -> "工作日";
    case 6, 7 -> "周末";
    default -> {
        System.out.println("无效输入");
        yield "未知";
    }
};

新特性优势:

  • 箭头语法:使用 -> 替代冒号,代码更紧凑。
  • 多值匹配:一个 case 可以匹配多个值,用逗号分隔。
  • 表达式化:switch 可以返回一个值,直接赋值给变量。
  • 无穿透:箭头语法默认不会穿透,无需 break。
  • yield 关键字:在代码块中返回表达式的值。

5. Java 17+ 的模式匹配(预览特性)

Java 17 引入了 switch 模式匹配的预览特性(Java 21 成为正式特性),允许在 case 中使用类型模式,进一步增强了 switch 的表达能力。

// 传统方式:需要 instanceof 和强制类型转换
Object obj = "Hello";
if (obj instanceof String) {
    String s = (String) obj;
    System.out.println(s.length());
}

// 模式匹配 switch(Java 17+ 预览)
Object obj = "Hello";
switch (obj) {
    case String s -> System.out.println(s.length());
    case Integer i -> System.out.println(i * 2);
    case null -> System.out.println("值为 null");
    default -> System.out.println("其他类型");
}

模式匹配的优势:

  • 简化了类型检查和转换的代码。
  • 提高了代码的可读性和安全性。
  • 支持匹配 null 值。

6. 最佳实践与注意事项

  • 始终包含 default 分支:即使你认为所有情况都已覆盖,添加 default 分支也是一个好习惯,可以处理意外情况。
  • 谨慎使用穿透:明确注释穿透是有意为之,避免因遗漏 break 导致的 bug。
  • 优先使用增强 switch:在新项目中,尽量使用 Java 12+ 的箭头语法和表达式形式,代码更简洁安全。
  • 保持 case 简洁:如果某个 case 的逻辑过于复杂,考虑提取为独立方法。
  • 枚举是天然搭档:switch 与枚举类型结合使用,可以使代码更加清晰和类型安全。

7. 总结

Java 的 switch 语句从最初简单的多分支选择,已经演变为功能强大、表达力丰富的控制结构。掌握其基本语法、理解穿透现象、熟练运用 Java 12+ 的增强特性以及了解模式匹配,能够帮助你编写出更简洁、更安全、更易维护的 Java 代码。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐