什么时候应该覆盖Equals功能?

时间:2012-06-13 08:06:54

标签: java

  

可能重复:
  Java: Always override equals?

我应该为我创建的任何类重写equals函数吗?

即使是非常简单的类,只包含一些非常简单的属性,而等于,我需要它的每一个属性都相等?

3 个答案:

答案 0 :(得分:30)

  

我应该为我创建的任何类重写equals函数吗?

覆盖equals if(且仅当)对象"代表某些数据",即它是否为PersonCar或{{1 (这些通常最终出现在集合中等)。不要覆盖其他类型的等号,例如RecipieIngredientLoginServlet

每当您覆盖DatabaseUtil时,请务必覆盖hashCode

  

(一个自然的后续问题:) 如果我不重写equals和hashCode会怎样?

任何两个对象都将被视为不等,除非它们是完全相同的对象。

  

[...]我需要它的每个属性都相等吗?

通常。这取决于如何定义你的平等概念。请注意,对于引用类型,您可以在实现自己的时候重用/委托 对象equals(和equals)的实现。

相关问题:

答案 1 :(得分:16)

如果您有理由,您应该只覆盖equals()。正如here所述,为非final或可变类编写适当的equals()方法非常困难。

如果您的应用程序需要某种与“相同对象”不同的平等概念,那么请务必继续。只需阅读上述参考资料即可了解所涉及的内容。但作为例行公事?绝对不是。

答案 2 :(得分:2)

嗯,如果你用现实生活方式来思考,那么更多地理解覆盖等于()的概念。

只有当逻辑上两个对象需要相等时,才应该覆盖等于方法。此外,如果你担心,程序中的某个地方可能会重新创建一个对象,那么你必须超越equals()。

一个非常好的例子是java中的String对象。

   String string1= new String("hello");

   String string2= "hello";

它们是否相同?是的,但绝对是......但是。您只能检查它们的相等性,因为Java已经过度使用了String equals()方法。

众所周知,类实际上是其对象的模板。因此,让我们考虑一下,有一个员工类,它实际上决定了公司员工可能拥有的属性,公司中的实际员工是该类的对象。通常,员工的属性可能如下所示。

1.员工姓名

2.员工ID

3.出生日期 。 。 。 .. 。 。 。 。 。

因此,在这种情况下,您应该检查equals方法中的员工ID是否相等。但是,如果你的对象缺乏这种独特的属性,那么你应该继续检查几乎所有的值,以避免让你的程序认为两个不同的人相等。