Java12引入了对switch语句的增强,允许在switch语句中使用表达式来代替传统的语句列表。这样可以使得代码更加简洁和易读。
switch表达式也是作为预览语言功能的第一个语言改动被引入新版Java中来的,这是一种引入新特性的测试版的方法。通过这种方式,能够根据用户反馈进行升级、更改,如果没有被很好的接纳,则可以完全删除该功能。预览功能的没有被包含在JavaSE规范中。也就是说:这不是一个正式的语法,是暂时进行测试的一种语法。
传统的switch声明语句(switch statement)在使用中有一些问题:
- 匹配自上而下,若无break,后面的case语句都会执行
- 不同的case语句定义的变量名不能重复
- 不能在一个case里写多个执行结果一致的条件
- 整个switch不能作为表达式返回值
switch详细语法
扩展的switch语句,不仅可以作为语句(statement),还可以作为表达式(expression),并且两种写法都可以使用传统的 switch语法,或者使用简化的case L ->
模式匹配语法作用于不同范围并控制执行流。这些更改将简化日常编码工作,并为 switch中的模式匹配(JEP305)做好准备。
使用Java12中switch表达式的写法,省去了break语句,避免了因少写break而出错。
同时将多个case合并到一行,显得简洁、清晰也更加优雅的表达逻辑分支,其具体写法就是将之前的case语句表成了case L ->
,即如果条件匹配case,则执行标签右侧的代码,同时标签右侧的代码段只能是表达式、代码块或throw语句。
为了保持兼容性,case条件语句中依然可以使用字符,这时fall-through规则依然有效的,即不能省略原有的break语句,但是同一个switch结构里不能混用->
和:
,否则会有编译错误。并且简化后的switch代码块中定义的局部变量,其作用域就限制在代码块中,而不是蔓延到整个switch结构,也不用根据不同的判断条件来给变量赋值。
JAVA12之前switch语句
package com.morris.java12;/*** java12之前switch的使用*/
public class SwitchBefore12Demo {public static void main(String[] args) {Month month = Month.APRIL;String season;switch (month) {case DECEMBER:case JANUARY:case FEBRUARY:season = "winter";break;case MARCH:case APRIL:case MAY:season = "spring";break;case JUNE:case JULY:case AUGUST:season = "summer";break;case SEPTEMBER:case OCTOBER:case NOVEMBER:season = "autumn";break;default:throw new RuntimeException("NoSuchMonthException");}System.out.println(season); // spring}
}
JAVA12中switch语句
package com.morris.java12;/*** java12中switch的使用*/
public class Switch12Demo {public static void main(String[] args) {Month month = Month.APRIL;String season;switch (month) {case DECEMBER, JANUARY, FEBRUARY -> season = "winter";case MARCH, APRIL, MAY -> season = "spring";case JUNE, JULY, AUGUST -> season = "summer";case SEPTEMBER, OCTOBER, NOVEMBER -> season = "autumn";default -> throw new RuntimeException("NoSuchMonthException");}System.out.println(season); // spring}
}
switch作为表达式返回值
下面是一个简单的示例:
package com.morris.java12;/*** java12中switch的使用,作为表达式的返回值*/
public class Switch12Demo2 {public static void main(String[] args) {Month month = Month.APRIL;String season = switch (month) {case DECEMBER, JANUARY, FEBRUARY -> "winter";case MARCH, APRIL, MAY -> "spring";case JUNE, JULY, AUGUST -> "summer";case SEPTEMBER, OCTOBER, NOVEMBER -> "autumn";default -> throw new RuntimeException("NoSuchMonthException");};System.out.println(season); // spring}
}
在这个示例中,switch语句的返回值是根据不同的case条件计算得出的。这种语法形式可以减少冗余的代码,提高代码的可读性。