在 Java 21 中,"switch 模式匹配"这一特性得到了正式的引入和改进,这是对 Java 语言模式匹配支持的扩展。开关表达式中的模式匹配最初作为预览功能在 Java 14 和后续版本中提供,并在 Java 17 中保持为预览状态。到了 Java 21,它可能已经成为标准功能,意味着它不再是预览状态,并且被鼓励在生产环境中使用。
Switch 模式匹配的核心特性包括:
-
更广泛的适用性:允许在
switch
语句中使用模式匹配来处理不同类型的值,不仅仅是传统的基于枚举或整数的情况,还包括类实例、密封类及其子类实例等,通过解构这些实例来访问其内部组件。 -
简洁的语法:模式匹配简化了需要对对象进行类型检查和解构的代码。例如,可以直接在
case
子句中匹配并解构一个类的实例,提取需要的字段或执行相应操作。 -
增强的表达力:
- 可以使用类型模式(如
case String s -> ...
)直接匹配并绑定到变量。 - 记录模式(如果引入)允许直接解构记录类的组件,如上一个回答中提到的那样。
- 使用守卫(guard clauses)添加额外的逻辑条件,如
case Integer i if (i > 0) -> ...
。
- 可以使用类型模式(如
-
提升代码的可读性和维护性:通过减少冗余的条件判断和显式的类型转换,使得代码更加清晰易懂。
示例(假设特性已稳定且记录模式也存在):
record Point(int x, int y) {}
Point p = new Point(10, 20);
switch(p) {
case Point(int x, int y) when x == y -> System.out.println("This is a diagonal point.");
case Point(var x, _) -> System.out.println("X coordinate: " + x);
case null -> System.out.println("Null point.");
default -> System.out.println("Other point.");
}
在这个例子中,switch
表达式利用模式匹配来检查 Point
记录的不同情况,包括它的坐标是否相等、只关注 x
坐标、处理 null
值,以及捕获所有其他情况。
请记住,虽然基于Java的发展趋势和先前预览特性的演进,上述描述符合预期的更新方向,但具体实现细节和最终特性集仍应参考Java 21的官方文档。