【问题标题】:when should I override Equals function? [duplicate]我什么时候应该覆盖 Equals 函数? [复制]
【发布时间】:2012-06-13 08:06:54
【问题描述】:

可能重复:
Java: Always override equals?

我应该为我创建的任何类覆盖equals 函数吗?

即使对于只包含一些非常简单的属性的非常简单的类,并且通过 equals 我需要它的每个属性都相等?

【问题讨论】:

    标签: java


    【解决方案1】:

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

    当(且仅当)对象“表示一些数据”时,覆盖 equals,即如果它对诸如 PersonCarRecipieIngredient 之类的东西建模(这些通常以集合等形式结束)。不要为其他类型的类覆盖 equals,例如 LoginServletDatabaseUtil

    请记住,无论何时覆盖equals,都要覆盖hashCode

    (一个自然的后续问题:)如果我不覆盖 equals 和 hashCode 会发生什么?

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

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

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

    相关问题:

    【讨论】:

    • +1 说得再好不过了,简单但很好的解释。
    【解决方案2】:

    只有在有理由的情况下才应覆盖equals()。正如here 所述,为非最终类或可变类编写正确的equals() 方法非常困难。

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

    【讨论】:

      【解决方案3】:

      好吧,如果您在现实生活中考虑它,则更容易理解覆盖 equals() 的概念。

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

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

         String string1= new String("hello");
      
         String string2= "hello";
      

      他们是平等的吗?..是的,他们绝对是..从逻辑上讲。您能够检查它们的相等性只是因为 Java 已经覆盖了 String equals() 方法。

      众所周知,类实际上是其对象的模板。所以让我们考虑一下,有一个员工类,它实际上决定了公司中的员工可以拥有哪些属性,而公司中的实际员工是这个类的对象。所以通常情况下,员工的属性可能如下。

      1.员工姓名

      2.员工编号

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

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

      【讨论】:

      • +1,很好的答案。不过,关于你的最后一点,有一些问题。如果员工是可变的,那么检查某些员工 ID 的方法可能会有风险。
      • 嗯...如果某些东西是可变的..他们完全失控了。整个 equals() 世界都失败了。
      • 你的理由是什么?
      • 好吧...您担心如果它是可变的,那么员工 ID 将不一致..那么 ..whatelse 可能会保持一致以确保平等..
      猜你喜欢
      • 2016-06-27
      • 2013-10-17
      • 2013-10-31
      • 2016-07-08
      • 1970-01-01
      • 2012-03-18
      • 2012-03-31
      • 1970-01-01
      • 2020-07-16
      相关资源
      最近更新 更多