java switch 模式匹配
ddatsh
Java 12之前,switch只是一个语句。现在可以使用switch表达式
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(记录模式)保持一致性