Java 12之前,switch只是一个语句。现在可以使用switch表达式

JEP 406

JEP 406 是一个关于在 Java 中为 switch 语句和表达式增加模式匹配功能的特性。最初作为预览功能在 JDK 17 中引入, JDK 18、19 继续迭代,JDK 21 中成为正式功能

主要目标

  • 扩展 switch 语句和表达式,允许在 case 标签中使用模式
  • 增加对模式匹配的支持,包括类型模式、守卫模式和括号模式
  • 确保向后兼容性,使得现有的 switch 语句和表达式可以不加修改地继续工作

新增模式类型

  • 类型模式:允许在 case 标签中指定类型,并声明一个局部变量
  • 守卫模式:使用 when 关键字结合布尔表达式来进一步细化模式
  • 括号模式:解决解析歧义,允许在模式周围使用括号

动机

Java 16 JEP 394 扩展了 instanceof 运算符以支持类型模式和模式匹配。使 instanceof 和强制转换的复合操作可以被简化。JEP 406 旨在将模式匹配的概念扩展到 switch,使 switch 语句能够更加灵活和强大

用法示例

switch (o) {
    case String s -> System.out.println(s);
    case Integer i -> System.out.println("Integer");
    default -> System.out.println("Unknown type");
}

完整性检查

JEP 406 还引入了对 switch 表达式和语句的完整性检查。如果 switch 的选择器表达式是一个封闭类(sealed class),编译器可以检查 switch 是否覆盖了所有的可能情况,从而确定是否需要 default 标签

依赖关系

JEP 406 建立在 JEP 394(模式匹配)和 JEP 361(switch 表达式)的基础上,并期望与 JEP 405(记录模式)保持一致性