问题历史:
在Java 12之前,switch操作符仅作为语句使用。随着Java 12/14的发布,出现了switch表达式,扩展了操作符的语法和功能。switch表达式旨在为更简洁和更具表现力的代码提供支持。
问题:
经典的switch通常会导致错误:忘记的break会导致fall-through,多个case时可读性差,无法直接在表达式中返回结果,缺乏对值的详尽检查。
解决方案:
switch表达式可以返回值,使用箭头语法,支持在编译阶段进行全面检查,并通过default处理null。其语法为:
String result = switch(day) { case MONDAY, FRIDAY -> "工作日"; case SATURDAY, SUNDAY -> "周末"; default -> throw new IllegalArgumentException(); };
关键特点:
switch可以与枚举、字符串和null一起使用吗?
与枚举从Java 5开始工作。与字符串从Java 7开始工作。null只能通过default处理,否则会出现NPE。
switch(day) { // day == null default: System.out.println("null"); } // 工作
如果在switch表达式中没有实现所有枚举值,会发生什么?
编译器会要求提供default或实现所有值。如果缺少这些,将出现编译错误。
在新类型的switch表达式中可以使用break吗?
在箭头语法中不需要break。如果使用块(case X -> { ... }),可以使用yield返回值:
int num = switch(x) { case 1 -> 10; case 2 -> { yield 20; } default -> 0; };
没有break的经典switch,使用int:
switch(type) { case 1: actionA(); case 2: actionB(); // 在type==1和type==2时都会调用 }
优点:
缺点:
使用新的switch表达式将枚举与结果匹配:
String status = switch(orderStatus) { case PAID -> "已支付"; case CANCELED -> "已取消"; default -> "处理中"; };
优点:
缺点: