JEP 441:使用switch的模式匹配转换 Java
2023年07月04日 由 Susan 发表
668973
0
JEP 441, "switch上的模式匹配"已从目标状态提升为已完成状态,适用于JDK 21。这个JEP最终确定了该功能,并根据之前四个预览版本的反馈意见进行了改进:JEP 433,《switch的模式匹配》(第四个预览版),发布于JDK 20;JEP 427,《switch的模式匹配》(第三个预览版),发布于JDK 19;JEP 420,《switch的模式匹配》(第二个预览版),发布于JDK 18;以及JEP 406,《switch的模式匹配》(预览版),发布于JDK 17。该功能通过为switch表达式和语句引入了模式匹配,增强了语言的功能。
switch的模式匹配是对传统switch语句和表达式的重大改进。该功能允许模式出现在 case 标签中,放宽了switch对 null 的限制,并通过要求模式switch语句覆盖所有可能的输入值来提高安全性。
模式匹配首先在Java 16中引入了 instanceof 运算符(JEP 394),使得该运算符可以使用类型模式进行模式匹配。这个扩展简化了 instanceof 和强制转换的惯用法,使它更加简洁且不容易出错。请考虑以下代码片段:
通过JDK 21,这种模式匹配已扩展到了switch表达式和语句,使其能够适用于任何类型,并允许在case标签中使用模式而不仅仅是常量。请考虑以下代码片段:
值得注意的是,这个版本还通过允许新的null case标签将null测试集成到了switch中。这个改动减少了处理null选择器表达式值时的样板代码和潜在错误。请考虑以下代码片段:
加入一个when子句的概念表明它应该用于提供除了模式匹配之外,必须满足的额外条件,以使case语句匹配。如果when子句中的条件求值为true,则将应用case标签。然而,这只是根据现有信息的推测,没有具体的示例和文档支持,实际使用方法仍在确定中。
JEP 441还扩展了对枚举类型的处理,允许在case常量中使用枚举常量的限定名称。该功能可用于对枚举类型进行切换。为了保持与现有Java代码的兼容性,在对枚举类型进行切换时,case常量仍然可以使用被切换的枚举类型的简单名称。
展望未来,OpenJDK团队提出了几个可能的增强功能,进一步扩展了Java中的模式匹配能力。这些包括添加AND模式和OR模式,为带有模式的case标签提供更多的表达能力。还有可能直接支持带有保护条件的模式作为一种特殊的模式形式,在switch语句中允许更复杂的条件逻辑。另一个令人兴奋的前景是,通用类可以声明解构模式,指定它们如何匹配。这些增强功能将继续推动Java中模式匹配的边界,使该语言对开发人员来说更加强大和灵活。
希望了解更多的开发人员可以参考《InfoQ》上的一篇文章,其中提供了Java模式匹配的全面指南。
希望尝试这些新功能的开发人员可以从JDK 21 Early-Access Builds中下载OpenJDK。
另一种选择是使用SDKMan,一个软件开发工具包管理器,来下载和管理不同版本的Java。SDKMan可以通过命令行使用,使偏好此方法的开发人员更容易进行操作。
然而,这些是早期访问版本,因此可能没有最终发布版稳定,最终版本预计于2023年9月发布,并且这些版本旨在进行测试和反馈。
来源:https://www.infoq.com/news/2023/07/tranforming-java-pattern/