【发布时间】:2012-06-13 08:06:54
【问题描述】:
我应该为我创建的任何类覆盖equals 函数吗?
即使对于只包含一些非常简单的属性的非常简单的类,并且通过 equals 我需要它的每个属性都相等?
【问题讨论】:
标签: java
我应该为我创建的任何类覆盖equals 函数吗?
即使对于只包含一些非常简单的属性的非常简单的类,并且通过 equals 我需要它的每个属性都相等?
【问题讨论】:
标签: java
我应该为我创建的任何类重写 equals 函数吗?
当(且仅当)对象“表示一些数据”时,覆盖 equals,即如果它对诸如 Person、Car 或 RecipieIngredient 之类的东西建模(这些通常以集合等形式结束)。不要为其他类型的类覆盖 equals,例如 LoginServlet 或 DatabaseUtil。
请记住,无论何时覆盖equals,都要覆盖hashCode。
(一个自然的后续问题:)如果我不覆盖 equals 和 hashCode 会发生什么?
任何两个对象都将被视为不相等,除非它们是完全相同的对象。
[...] 我需要它的每一个属性都相等吗?
通常是。这取决于你如何定义你的平等概念。请注意,对于引用类型,您可以在实现自己的时重用/委托给 that 对象实现 equals(和 hashCode)。
相关问题:
【讨论】:
只有在有理由的情况下才应覆盖equals()。正如here 所述,为非最终类或可变类编写正确的equals() 方法非常困难。
如果您的应用程序需要某种不同于“相同对象”的相等概念,那么请务必继续。只需阅读上述参考资料即可了解所涉及的内容。但作为例行公事?绝对不是。
【讨论】:
好吧,如果您在现实生活中考虑它,则更容易理解覆盖 equals() 的概念。
只有当两个对象需要在逻辑上相等时才应该重写 Equals 方法。另外,如果您担心在程序中的某个地方可能会重新创建对象,那么您必须覆盖 equals()。
一个很好的例子是java中的String对象。
String string1= new String("hello");
String string2= "hello";
他们是平等的吗?..是的,他们绝对是..从逻辑上讲。您能够检查它们的相等性只是因为 Java 已经覆盖了 String equals() 方法。
众所周知,类实际上是其对象的模板。所以让我们考虑一下,有一个员工类,它实际上决定了公司中的员工可以拥有哪些属性,而公司中的实际员工是这个类的对象。所以通常情况下,员工的属性可能如下。
1.员工姓名
2.员工编号
3.出生日期 . . . ... . . . . .
所以在这种情况下,您应该只在 equals 方法中检查员工 ID 是否相等。但是,是的,如果您的对象缺少这种不同的属性,那么您应该继续检查几乎所有的值,以避免让您的程序认为两个不同的人相等。
【讨论】: