编程后端开发者

什么是Java中的switch表达式,它与经典的switch有什么区别,以及使用时有什么细节?

用 Hintsage AI 助手通过面试

答案。

问题历史:

在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变为表达式:可以将其结果赋值给变量。
  • 新语法提高了可读性,防止了忘记的break。
  • 支持多个标签(case A, B -> ...)。

隐含问题。

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; };

常见错误和反模式

  • 在处理非空类型时缺少default会导致编译错误。
  • 尝试在非default中处理null将引发NullPointerException。
  • 使用switch进行大量嵌套,而不是多态。

生活中的例子

负面案例

没有break的经典switch,使用int:

switch(type) { case 1: actionA(); case 2: actionB(); // 在type==1和type==2时都会调用 }

优点:

  • 快速编写。

缺点:

  • 小错误会导致严重bug。
  • 代码难以阅读和维护。

正面案例

使用新的switch表达式将枚举与结果匹配:

String status = switch(orderStatus) { case PAID -> "已支付"; case CANCELED -> "已取消"; default -> "处理中"; };

优点:

  • 全面分析——错误更少。
  • 代码简洁且易读。

缺点:

  • 需要Java 14+和现代语法的知识。