等价类划分
Liam Miller-Cushon发布了一个名为“ Equivalence ”的文档,其中他建议“创建一个库解决方案,以帮助产生equals()和hashCode()的可读,正确和高效的实现。” 在这篇文章中,我总结了一些原因,即使我的提案从未实现,我也认为该提案值得大多数Java开发人员阅读;如果实现,那么该提案的实现也会使所有Java开发人员受益。
Miller-Cushon用单句段开头的建议:“正确实现equals()和hashCode()需要太多的仪式。” 该建议指出,当今功能强大的Java IDE在生成这些方法方面做得很好,但是仍然存在要读取和维护的代码。 该提案还提到“随着时间的流逝,这些方法将成为隐藏错误的地方。” 对于这些方法之一中的错误导致的特别隐蔽的错误,我的错误尝试不止一次,而且检测起来很棘手。
这三个版本的“ Effective Java ”均提供了有关如何编写这些方法的有效实现的详细说明和示例,但仍然容易出错。 JDK 7 ( Project Coin )引入的方法Objects.equals(Object,Object)和Objects.hash(Object…)起到了很大的作用(特别是在可读性和正确处理null
),但是在Object.equals(Object)
和Object.hashCode()
。
即使这种“对等”建议从未实现,但阅读Miller-Cushon的文件还是有一定价值的。 该文档的一个明显好处是捕获了“ equals
和hashCode
实现中的错误示例”。 当前,本节中有九个项目符号描述“ equals
和hashCode
方法的实现中的大量错误”,这些错误通常仅在执行“静态分析以防止这些问题”时才被识别。 这些示例很好地提醒了编写这些方法的实现时要小心的事情,并且还使我们想起了静态分析的价值(请注意,Miller-Cushon处于易于出错的静态分析工具的背后)。
对于那些希望更好地理解在Java中开发等效概念时应该考虑的相关问题的人来说,阅读“等效”文档也可能具有启发性。 通过“需求”和“设计问题”部分中的一系列问题,本文档考虑了需要权衡和实现的选择。 这些主题包括诸如如何处理null
, instanceof
与getClass()
以及与Comparator
的关系等主题。 今天,Java开发人员应该实现或维护自己的equals(Object)
和hashCode()
实现,可以考虑许多这些考虑因素。
“等效性”文档的“相关阅读”部分提供了一些有趣的链接,其中包括2009年经典文章“如何用Java编写平等方法”和RémiForax的ObjectSupport类(在某些情况下, 该类委派给ObjectSupports ) 。
“等效”建议在OpenJDK琥珀色规范专家邮件列表上的标题为“用于实现equals和hashCode的库”中进行了介绍,并且对该邮件列表的一些反馈导致了文档的更新。 在这次讨论中,对我来说特别有趣的一句话是Brian Goetz的声明:“人们过去通常明确地实现equals
/ hashCode
,这是我们过去想要表达的。 ”这似乎是一个可喜的变化!
翻译自: https://www.javacodegeeks.com/2019/05/determining-equivalence-java.html
等价类划分