重写Object方法良好的编程实践?

时间:2013-04-10 09:16:03

标签: java override

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

7 个答案:

答案 0 :(得分:7)

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

  

...实现对象上最具辨别力的等价关系;也就是说,对于任何非null引用值xy,此方法仅当truex引用时返回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的键时,您确实需要覆盖这些方法。