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