Java switch语句的使用详解

 更新时间:2025年07月14日 08:57:04   作者:晚夜微雨问海棠呀  
Java switch语句随JDK演进支持int/char、String及模式匹配,具备表达式限制、穿透控制、作用域隔离等特性,适用于状态机、命令解析等场景,需注意类型兼容性及break使用,推荐使用箭头语法和编译器优化提升代码质量

Java switch语句

一、基础语法演进

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

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

二、核心特性

表达式限制

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

类型匹配规则

Object obj = "test";
switch (obj) {
    case Integer i -> System.out.println("整数");
    case String s -> System.out.println(s.length());
    default -> System.out.println("未知类型");
}

返回值支持 (Java 14+)

使用yield返回值的表达式形式:

int code = switch (day) {
    case MONDAY -> 1;
    case TUESDAY -> {
        System.out.println("周二");
        yield 2;
    }
    default -> 0;
};

三、关键机制

穿透控制

  • 传统case需显式break,否则执行后续所有case
  • 箭头语法(->)自动阻断穿透,无需break

作用域隔离

每个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)转换为支持的类型

六、最佳实践

防御性编程

switch (status) {
    case SUCCESS -> handleSuccess();
    case FAILURE -> handleFailure();
    default -> throw new IllegalStateException(); // 强制覆盖所有情况
}

模式匹配优化 (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("正整数");
}

性能优化

  • 超过5个分支时,优先选择switch而非if-else
  • 编译器对switch生成跳转表,时间复杂度O(1)

七、代码风格建议

  • 对齐case子句缩进
  • 复杂逻辑封装为方法调用
  • case合并时垂直排列:
case JANUARY, MARCH, MAY, 
     JULY, AUGUST -> days = 31;

扩展思考

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

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java中的StackOverflowError错误问题及解决方法

    Java中的StackOverflowError错误问题及解决方法

    这篇文章主要介绍了Java中的StackOverflowError错误,在本文中,我们仔细研究了StackOverflower错误,包括Java代码如何导致它,以及我们如何诊断和修复它,需要的朋友可以参考下
    2022-07-07
  • Spring MVC URL地址映射的示例代码

    Spring MVC URL地址映射的示例代码

    @RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。,这篇文章主要介绍了Spring MVC URL地址映射,需要的朋友可以参考下
    2022-07-07
  • Java使用延时队列搞定超时订单处理的场景

    Java使用延时队列搞定超时订单处理的场景

    这篇文章主要介绍了Java使用延时队列搞定超时订单处理,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-08-08
  • Spring boot集成Go-FastDFS实现图片上传删除等功能实现

    Spring boot集成Go-FastDFS实现图片上传删除等功能实现

    这篇文章主要介绍了Spring boot集成Go-FastDFS实现图片上传删除等功能实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • Java NIO Buffer实现原理详解

    Java NIO Buffer实现原理详解

    本篇文章主要对NIO核心三件套:缓冲区(Buffer)、选择器 (Selector)和通道(Channel),其中之一的缓冲区Buffer实现原理的学习总结。感兴趣的小伙伴可以了解一下
    2021-11-11
  • Springboot基于BCrypt非对称加密字符串的实现

    Springboot基于BCrypt非对称加密字符串的实现

    本文主要介绍了Springboot基于BCrypt非对称加密字符串的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • Java Heap Dump简介及使用举例

    Java Heap Dump简介及使用举例

    文章详解了Java堆转储(HeapDump)的概念、核心内容、生成方法及分析工具,强调其在诊断内存泄漏、溢出中的关键作用,推荐使用JVM参数自动触发,并指出EclipseMAT为最强大分析工具,同时提醒注意性能影响和数据安全,感兴趣的朋友跟随小编一起看看吧
    2022-12-12
  • java基于spring boot本地上传图片示例解析

    java基于spring boot本地上传图片示例解析

    这篇文章主要介绍了java基于spring boot本地上传图片示例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • Spring Boot配置动态更新问题

    Spring Boot配置动态更新问题

    这篇文章主要介绍了Spring Boot配置动态更新问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • Java中的程序计数器是什么

    Java中的程序计数器是什么

    这篇文章主要介绍了Java中的程序计数器是什么,帮助大家更好的理解和学习Java,感兴趣的朋友可以了解下
    2020-09-09

最新评论