等价类划分_确定Java等价性的新时代?

等价类划分

等价类划分

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的文件还是有一定价值的。 该文档的一个明显好处是捕获了“ equalshashCode实现中的错误示例”。 当前,本节中有九个项目符号描述“ equalshashCode方法的实现中的大量错误”,这些错误通常仅在执行“静态分析以防止这些问题”时才被识别。 这些示例很好地提醒了编写这些方法的实现时要小心的事情,并且还使我们想起了静态分析的价值(请注意,Miller-Cushon处于易于出错的静态分析工具的背后)。

对于那些希望更好地理解在Java中开发等效概念时应该考虑的相关问题的人来说,阅读“等效”文档也可能具有启发性。 通过“需求”和“设计问题”部分中的一系列问题,本文档考虑了需要权衡和实现的选择。 这些主题包括诸如如何处理nullinstanceofgetClass()以及与Comparator的关系等主题。 今天,Java开发人员应该实现或维护自己的equals(Object)hashCode()实现,可以考虑许多这些考虑因素。

等效性”文档的“相关阅读”部分提供了一些有趣的链接,其中包括2009年经典文章“如何用Java编写平等方法”和RémiForaxObjectSupport类(在某些情况下, 该类委派给ObjectSupports ) 。

等效”建议在OpenJDK琥珀色规范专家邮件列表上的标题为“用于实现equals和hashCode的库”中进行了介绍,并且对该邮件列表的一些反馈导致了文档的更新。 在这次讨论中,对我来说特别有趣的一句话是Brian Goetz的声明:“人们过去通常明确地实现equals / hashCode这是我们过去想要表达的。 ”这似乎是一个可喜的变化!

翻译自: https://www.javacodegeeks.com/2019/05/determining-equivalence-java.html

等价类划分

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值