【发布时间】:2017-06-13 06:49:35
【问题描述】:
如果我只需要比较对象而不打算将对象放入任何基于哈希的容器中,我是否可以只实现 equals() 而不是 hashCode()?
似乎所有 Java 圣经都说这两个必须一起实现。 :(
我的担忧: - 如果我总是将 hashCode() 和 equals() 一起实现,将会有很多代码没有真正使用,并且没有单元测试覆盖。 (如果不使用,我不会对 hashCode() 进行单元测试) - 直到我将对象放入基于散列的容器中时,我才知道如何查找对象。只有到那时我才能确定使用哪种散列策略。
【问题讨论】:
-
参考您的担忧:您可能想研究使用 github.com/jqno/equalsverifier 自动测试 equals/hashcode 合约
-
使代码符合对象规范的一种简单方法是从 hashCode 返回相同的常量值。这并不理想(即,如果将其用作哈希,则会发生严重的冲突),但它永远不会“失败”,因为合同得到维护......