Java 21的模式匹配功能彻底改变了我们处理条件分支的方式。通过将类型检查、类型转换和变量绑定合并为单个操作,这项特性显著减少了样板代码,同时提高了代码的可读性和安全性
核心内容
1. 传统方式的局限性
在Java 21之前,处理多类型条件需要冗长的instanceof
和显式类型转换:
1
2
3
4
5
6
7
8
| // 传统方式:冗长且容易出错
if (obj instanceof String) {
String s = (String) obj;
System.out.println(s.length());
} else if (obj instanceof Integer) {
Integer i = (Integer) obj;
System.out.println(i * 2);
}
|
2. 模式匹配的解决方案
Java 21引入的模式匹配将类型检查和转换合二为一:
1
2
3
4
5
6
| // 现代方式:简洁且安全
if (obj instanceof String s) {
System.out.println(s.length());
} else if (obj instanceof Integer i) {
System.out.println(i * 2);
}
|
3. Switch模式匹配
Java 21进一步扩展了模式匹配到switch表达式:
1
2
3
4
5
6
7
8
| String formatter(Object obj) {
return switch (obj) {
case Integer i -> String.format("int %d", i);
case String s -> String.format("String %s", s);
case null -> "null";
default -> obj.toString();
};
}
|
最佳实践
1. 记录模式匹配
结合记录类使用模式匹配,实现优雅的数据解构:
1
2
3
4
5
6
7
| record Point(int x, int y) {}
void process(Point p) {
if (p instanceof Point(int x, int y)) {
System.out.println("x: " + x + ", y: " + y);
}
}
|
2. 防护模式
使用when子句添加额外的条件检查:
1
2
3
4
5
6
7
8
| String classify(Object obj) {
return switch (obj) {
case String s when s.length() > 10 -> "长字符串";
case String s -> "短字符串";
case Integer i when i > 0 -> "正整数";
default -> "其他";
};
}
|
性能考虑
- 模式匹配在编译时进行优化,运行时性能与传统方式相当
- JVM会优化类型检查流程,避免不必要的开销
- 对于性能敏感场景,建议进行基准测试
