对于一个编程项目,我们制作了大约24个我们需要的类。即使我们没有使用它们,从Object覆盖equals()
和hashcode()
函数是否是一种很好的编程习惯?我们认为如果我们将来需要它们可能会很好,但我们不确定。
答案 0 :(得分:7)
除非您需要与equals
提供的hashCode
和Object
不同的实现,否则请勿覆盖它们。如JavaDoc中所述,Object
版本...
...实现对象上最具辨别力的等价关系;也就是说,对于任何非
null
引用值x
和y
,此方法仅当true
和x
引用时返回y
到同一个对象(x == y
的值为true
)。
如果equals
需要不同的含义(例如,String
,则只会覆盖它们)。 (而且你是完全正确的,如果你覆盖一个,你几乎总是需要覆盖另一个。)
答案 1 :(得分:2)
不是真的。只在你需要时才这样做。
答案 2 :(得分:2)
编码你知道不需要的东西是没有意义的。
OTOH,equals和hashCode非常有用,你可能很容易在没有意识到的情况下使用它们,例如。
HashMap
assertEquals
基本上,如果你的对象有值语义,以某种方式用作“数据”并且不是单例,那么你可能最终必须由于上述一个或多个原因而重写equals。
答案 3 :(得分:1)
我会犹豫是否仅仅因为你“可能”需要它们来覆盖某些方法。让需要出现,然后解决问题。提供了这些方法的默认实现,并且可以直接使用集合,添加自己的实现可能会产生问题。
答案 4 :(得分:1)
即使您没有直接调用它,某些方法也会使用equals
。
只有在真的需要它时才应该这样做。 (如果Object.equals()
和Object.hashcode()
没有为您的班级做到所需的事情)
答案 5 :(得分:1)
您应该在需要时覆盖equals()
和hashCode()
,并且您应该始终覆盖toString()
答案 6 :(得分:0)
除非你确实需要,否则不要覆盖它。当您尝试将这些对象用作HashMap
的键时,您确实需要覆盖这些方法。