Java中switch分支合并有两种方式:传统语句通过省略break实现case穿透,Java 14+表达式则用|连接多个值;需注意类型一致、风格统一,避免掩盖逻辑差异。

Java 中 switch 分支合并,核心是让多个 case 值共享同一段执行逻辑,避免重复代码。关键在于“省略 break”或“用 | 连接多个值”,具体取决于你用的是传统 switch 语句还是 Java 14+ 的 switch 表达式。
传统 switch 语句:连续列出 case,不写 break
这是最常用、兼容性最好的方式。把需要执行相同逻辑的多个常量值依次写出,中间不加 break,直到最后统一处理。
- case 值必须是编译期常量(如字面量、final 变量)
- 从第一个匹配的 case 开始,顺序执行,直到遇到 break 或 switch 结束
- 这种“无 break 落空”行为叫 case 穿透(fall-through),这里是有意利用它
示例:
char grade = 'B';switch (grade) {
case 'A':
case 'B':
case 'C':
System.out.println("通过");
break;
case 'D':
case 'E':
System.out.println("不通过");
break;
default:
System.out.println("无效成绩");
}
Java 14+ switch 表达式:用竖线 | 合并多个值
在 switch 表达式(使用 -> 箭头语法)中,允许用 | 分隔多个匹配值,写法更紧凑、语义更清晰,且不会误触发穿透问题。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
立即学习“Java免费学习笔记(深入)”;
- 所有分支必须统一用 ->,不能混用 : 和 yield
- 每个 -> 右侧必须是表达式(自动返回值),不能是语句块(除非用大括号包裹)
- 多个值之间用 | 连接,前后空格可选但建议保持一致
示例:
String result = switch (x) {case 1 | 2 | 3 -> "small";
case 4 | 5 | 6 -> "medium";
case 7, 8, 9 -> "large"; // 注意:逗号写法也合法(JDK 21+),但 | 更通用
default -> "unknown";
};
合并时要注意的细节
- 类型必须严格一致:int 和 Integer 可混用,但 String 和 StringBuilder 不行
- 枚举值合并直接写枚举常量名,如 case STATUS.ACTIVE | STATUS.PENDING
- 字符串合并支持,但每个字符串字面量必须独立写出,不能写成 case "a" | "b"
- 不要在同一个 switch 中混用传统语句风格(: + break)和表达式风格(->),会编译报错
什么时候不该合并?
当看似相同的 case 实际隐含不同上下文(比如日志、计数、副作用操作),强行合并可能掩盖逻辑差异。例如:
- case 1: log("start"); doWork(); break;
- case 2: log("retry"); doWork(); break;
虽然 doWork() 相同,但日志不同——这时合并会丢失关键信息,应保留独立分支。

















