0

对于一个编程项目,我们制作了大约两打我们需要的类。即使我们没有使用它们,从 Object覆盖equals()和函数是一种好的编程习惯吗?hashcode()我们认为这可能会很好,以防我们将来需要它们,但我们不确定。

4

7 回答 7

7

除非您需要与 提供的equals和不同的实现,否则不要覆盖它们。如JavaDoc中所述,版本...hashCodeObjectObject

...在对象上实现最有区别的可能等价关系;也就是说,对于任何非null引用值xand ,当且仅当and引用同一个对象(具有值)y时,此方法才返回。truexyx == ytrue

如果您需要不同的含义equals(例如,String确实如此),您只会覆盖它们。(而且你说得很对,如果你覆盖一个,你几乎总是需要覆盖另一个。)

于 2013-04-10T09:17:48.930 回答
2

并不真地。仅在需要时才这样做。

于 2013-04-10T09:17:39.477 回答
2

编写一些你知道你不需要的东西是没有意义的。

OTOH、equals 和 hashCode 对覆盖非常有用,您可能很容易在没有意识到的情况下使用它们,例如

  • 将对象放入一个HashMap
  • 间接测试相等性,例如使用单元测试assertEquals
  • 测试对象是否存在于集合中

基本上,如果您的对象具有值语义,以某种方式用作“数据”并且不是单例,那么由于上述一个或多个原因,您最终可能不得不覆盖 equals。

于 2013-04-10T09:21:50.367 回答
1

我会犹豫是否仅仅因为您“可能”需要它们而重写某些方法。让需求出现,然后解决问题。提供了这些方法的默认实现,并且可以使用集合开箱即用,添加您自己的实现可能会产生问题。

于 2013-04-10T09:17:08.487 回答
1

equals即使您不直接调用它,某些方法也会使用。

只有当你真的需要它时,你才应该这样做。(如果Object.equals()并且Object.hashcode()没有为您的班级做它需要做的事情)

于 2013-04-10T09:18:39.450 回答
1

你应该覆盖equals()hashCode()当你需要时,你应该总是覆盖toString()

于 2013-04-10T09:19:16.043 回答
0

除非你真的需要它,否则不要覆盖它。当您尝试将这些对象用作HashMap.

于 2013-04-10T09:20:41.100 回答