概述
《java核心技术》一书中对新switch和旧版switch的形容是非直通和直通式,旧的switch大家都知道,如果没有break语句就会一直执行后续的case语句,就像是一直往下通一样;而新版的switch则不需要break语句,只会执行其中一个分支。
而这种switch在使用规范上更加严格,也有很多新特性,例如switch语句的返回值。
特性
1.java 12中对switch语句引入了具有返回值的形式,这种形式可以也必须使用yield去返回一个值,并让switch语句可以返回一个值;同时这种具有返回值的switch必须要使用分号放在整个表达式之后;需要注意你的case必须包含所有的可能性,或者用default;这样的switch还不能使用break,return,continue语句(因为每个case中必须包含的yield已经让这个switch失去了直通性了,所以也不必使用break)。
以下这个例子中,a是整形变量,因此default是必须的,同时最后一行反括号中的分号也是必须的。
int b = switch(a){
case 1:
yield 999;
default:
yield 1;
};
2.java 14中引入了使用箭头代替分号的形式,这种形式为非直通式, 不需要break语句。
同样的,使用箭头的switch也有两种形式,有返回值的和无返回值的,前者也必须要末尾分号:
int b = switch(a){
case 1 -> { //即便只有一个语句,也必须使用大括号
yield 999;
}
default -> 1; //如果只有一个返回值语句,则可以不使用yield
}; //有返回值的switch必须要末尾分号
switch(a){ //等同于旧版switch不需要break,单语句可以不打大括号
case 1 ->
System.out.println(999);
default ->
System.out.println(1);
} //无返回值的switch不需要末尾分号
3.java 14提供了多个case值写在一起的缩进语法,覆盖直通式和非直通式两种switch。
switch(a){
case 1,2,3 ->
System.out.println(999);
default ->
System.out.println(1);
}
switch(a){
case 1,2,3:
System.out.println(999);
default :
System.out.println(1);
}
经验总结
1.由于java是向下兼容的,所以直通式无返回值的旧版switch的所有特性都不受影响。
2.对于有返回值的switch:switch表达式需要末尾分号;必须覆盖所有可能的情况;不能使用break、return、continue语句;冒号switch使用yield返回参数,箭头switch可以使用yield语句也可以在只有一个返回值语句时直接给出一个值。
3.在有返回值的箭头switch中,只要不是直接返回值的case,但凡有一个语句就必须使用大括号。
4.提供了多个case值使用逗号分隔的缩进语法。