元数据卡
- 前置知识:if/else 分支逻辑
- 预计时间:10 分钟
- 完成标志:能用
switch替代多路 if-else,理解break和穿透
你走进铁匠铺,阿花在柜台上摆了三种货品:
"大剑 50 铜币,盾牌 30 铜币,药水 10 铜币。你要哪个?"
用 if-else 也能写,但每次判断都调 equals,有点啰嗦。更自然的写法是 switch——精准匹配一个值:
java
String choice = "大剑";
switch (choice) {
case "大剑":
System.out.println("50 铜币");
break;
case "盾牌":
System.out.println("30 铜币");
break;
case "药水":
System.out.println("10 铜币");
break;
default:
System.out.println("没有这个商品");
}语言:Java 17+ 预期输出:50 铜币
Python 差异: Python 3.10+ 有
match-case,不需要break:case "大剑": print("50 铜币"),默认用case _。 C++ 差异: 语法类似,但 C++ 的 switch 只支持整数和枚举,不支持 String。
那个烦人的 break——以及穿透
如果去掉 break 会怎样:
java
String choice = "大剑";
switch (choice) {
case "大剑":
System.out.println("50 铜币"); // 没有 break!
case "盾牌":
System.out.println("30 铜币");
break;
default:
System.out.println("没有这个商品");
}预期输出:
50 铜币
30 铜币这叫穿透(fall-through)——一个 case 执行完后直接"掉进"下一个,不检查。大多数时候是 bug,但少数场景是特性——比如多个 case 共享代码:
java
int day = 3;
switch (day) {
case 1: case 2: case 3: case 4: case 5:
System.out.println("工作日");
break;
case 6: case 7:
System.out.println("周末");
break;
}语言:Java 预期输出:工作日
Java 14+ 箭头语法——更干净
从 Java 14 开始,switch 有了箭头语法——不用写 break,没有穿透:
java
String choice = "药水";
String price = switch (choice) {
case "大剑" -> "50 铜币";
case "盾牌" -> "30 铜币";
case "药水" -> "10 铜币";
default -> "没有这个商品";
};
System.out.println(price); // 10 铜币语言:Java 17+(需 Java 14+) 预期输出:10 铜币
箭头 switch 还能用 yield 处理多行代码块,并且可以直接赋值给变量——老式冒号 switch 不行。
旅人笔记
switch 专治"同一个变量对不同的值做不同的事"。break 防穿透。箭头语法更干净。忘了写 break?用箭头语法直接从源头消灭这个问题。