问题背景
模式匹配是一种来自于函数式和脚本语言的技术,允许在一个步骤中检查类型并提取数据。在Java中,模式匹配的发展始于Java 14(预览特性),在Java 16-17中得到了改进,并在最新版本中扩展到了switch。
问题
传统的类型检查和转换方法显得比较繁琐:
if (obj instanceof String) { String s = (String) obj; ... }
这样会产生多余的变量,大量的模板代码以及类型转换的错误风险。
解决方案
模式匹配允许在一个表达式中结合类型检查、新变量的声明和它的使用:
if (obj instanceof String s) { System.out.println(s.length()); }
类似的模式现在在switch语句中也出现了,这使得代码更加简洁且不易出错。
关键特点:
模式匹配可以用于自定义类吗,还是只限于标准类型?
可以用于任何类。模式匹配适用于所有可以应用instanceof的类。
模式变量会在if/switch块外部可见吗?
不,模式匹配中声明的变量只在创建它的块内可见(例如,在if或case switch中)。
代码示例:
if (obj instanceof Integer i) { // i只在这个块内可见 System.out.println(i + 10); } // 在这里i不可用
可以将模式匹配与泛型一起使用吗?
可以,像这样:
Object list = List.of("a", "b"); if (list instanceof List<?> l) { System.out.println(l.size()); }
但由于类型擦除,与原始类型的操作和转换仍然受到限制。
团队在所有情况下都实施了模式匹配,包括内部DTO、服务类及可以用多态实现的场景。代码过于依赖instanceof,类层次的角色变得模糊。
优点:
缺点:
在项目中,模式匹配仅用于通用接口、辅助工具和处理未知类型的集合。面向对象的架构得到保留,模式仅在必要时使用。
优点:
缺点: