Java switch语句

Java switch 语句详解

一、基础语法演进
// 传统形式 (Java 1.0+)
switch (表达式) {
    case 常量1:
        语句;
        break; // 防止穿透
    case 常量2:
        语句;
        break;
    default:
        默认处理;
}

// 增强模式 (Java 12+)
switch (表达式) {
    case 常量1 -> 语句; // 自动阻断穿透
    case 常量2, 常量3 -> { // 多case合并
        复合语句;
    }
    default -> 默认处理;
}
二、核心特性
  1. 表达式限制

    • JDK 1-6:仅支持int/char及包装类、枚举
    • JDK 7+:支持String类型(区分大小写)
    • JDK 14+:支持模式匹配(预览特性)
  2. 类型匹配规则

    Object obj = "test";
    switch (obj) {
        case Integer i -> System.out.println("整数");
        case String s -> System.out.println(s.length());
        default -> System.out.println("未知类型");
    }
    
  3. 返回值支持 (Java 14+)
    使用yield返回值的表达式形式:

    int code = switch (day) {
        case MONDAY -> 1;
        case TUESDAY -> {
            System.out.println("周二");
            yield 2;
        }
        default -> 0;
    };
    
三、关键机制
  1. 穿透控制

    • 传统case需显式break,否则执行后续所有case
    • 箭头语法(->)自动阻断穿透,无需break
  2. 作用域隔离
    每个case块形成独立作用域:

    switch (x) {
        case 1 -> {
            String msg = "one"; // 仅在此块有效
        }
        case 2 -> {
            String msg = "two"; // 允许同名变量
        }
    }
    
四、典型应用场景
场景示例
状态机处理订单状态流转判断
命令解析CLI参数匹配执行
类型分发处理多态替代方案
五、常见错误示例
错误类型错误代码修正方案
缺失breakcase 1: doA(); case 2: doB();添加break或改用箭头语法
重复case值case 10: case 10:确保case常量唯一
类型不兼容switch(3.14)转换为支持的类型
六、最佳实践
  1. 防御性编程

    switch (status) {
        case SUCCESS -> handleSuccess();
        case FAILURE -> handleFailure();
        default -> throw new IllegalStateException(); // 强制覆盖所有情况
    }
    
  2. 模式匹配优化 (Java 17+)

    switch (obj) {
        case null -> System.out.println("空值");
        case String s when s.length()>5 -> System.out.println("长字符串");
        case Integer i && i > 0 -> System.out.println("正整数");
    }
    
  3. 性能优化

    • 超过5个分支时,优先选择switch而非if-else
    • 编译器对switch生成跳转表,时间复杂度O(1)
七、代码风格建议
  1. 对齐case子句缩进
  2. 复杂逻辑封装为方法调用
  3. case合并时垂直排列:
    case JANUARY, MARCH, MAY, 
         JULY, AUGUST -> days = 31;
    

扩展思考:对于大型状态机,可结合枚举类和switch实现,或采用状态模式提升可维护性。新版switch表达式通过编译期类型检查,显著增强代码健壮性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值