穿透的switch -java

switch的穿透

在switch块中,每一个case都必须有一个break;否则,它会跑到下一个case或者下下一个case中去执行语句。

这就是switch中case的穿透。

之前觉得这样的设计简直鸡肋,直到发现了case穿透的好处:可以对多个匹配项统一处理甚至叠加处理,它让switch更灵活了。

统一地处理

有一群人 小红,小明,小兰,路人 。

来个有意思的处理: 小红和小明 吃肉;小兰吃面;路人喝汤

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class Main6 {
public static void main(String[] args) {
List<String> mem = new ArrayList<>();
mem.add("小红");
mem.add("小明");
mem.add("小兰");
mem.add("路人");
for(String m:mem) {
System.out.print(m + ":");
switch(m){
case "小红":
case "小明":
System.out.print("吃肉");
break;
case "小兰":
System.out.print("吃面");
break;
default:
System.out.print("喝汤");
break;
}
System.out.println();
}
}
}

叠加地处理

有一群人 小红,小明,小兰,路人 。

来个有意思的处理: 路人喝水,小兰喝汤,小红喝汤吃面,小明喝汤吃面吃肉;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class Main7 {
public static void main(String[] args) {
List<String> mem = new ArrayList<>();
mem.add("小明");
mem.add("小红");
mem.add("小兰");
mem.add("路人");
for(String m:mem) {
System.out.print(m + ":");
switch(m){
case "小明":
System.out.print("吃肉");
case "小红":
System.out.print("吃面");
case "小兰":
System.out.print("喝汤");
break;
default:
System.out.print("喝水");
break;
}
System.out.println();
}
}
}

注意事项:

  1. default一般写在最后,但是写在任意两个case之间或者是case之上也是没问题的,问题是不写在最后的default的break不能省略,否则也会有穿透效果。建议习惯是default的break一直要写。
  2. 多个case后面的数值不可以重复。
  3. switch后面小括号中只能是下列数据类型:
    1. 基本数据类型:byte/short/char/int
    2. 引用数据类型:String字符串(1.7+)、enum枚举
  4. break写或不写的穿透与否自己可以掌握,十分灵活。

穿透的switch -java
https://blog.wangxk.cc/2020/08/17/穿透的switch-java/
作者
Mike
发布于
2020年8月17日
许可协议