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