我是否需要为 inheritedClass 和 Base Class 定义 equals 和 hashCode 方法?

Do I need to define equals and hashCode methods for inheritedClass and Base Class?

我想知道是否应该在 Product class 中定义 equalshashCode 方法,如下所示?

public abstract class BaseEntity {

    // properties 

    @Override
    public int hashCode() {
        return super.hashCode();
    }

    @Override
    public boolean equals(Object other) {
        return super.equals(other);
    }
}
public class Product extends BaseEntity {

    // properties   

    @Override
    public int hashCode() {
        return super.hashCode();
    }

    @Override
    public boolean equals(Object other) {
        return super.equals(other);
    }
}

定义 equalshashcode 调用其超级实现的方法没有用。 根本不定义它们将使用 super 实现。 在那种情况下,他们将使用哈希码的 Object 实现,并且在任何一种情况下都等于(定义它们调用 super.equals 或 super.hashCode 或根本不定义它们)。

如果需要使用它们,请记住实现哈希码和等于。方法 equals 用于检查两个对象在逻辑上是否是同一对象,检查它们的内容。例如,当您在集合中搜索对象时,可以直接使用,也可以不直接使用。哈希码用于 HashMap 的键和 HashSet 的值。

现代 ide 可帮助您根据在您的上下文中有用的字段创建这些方法的正确实现。

@federico 为了给你正确的答案一些细节,

equals 和 hashCode 是对象 class 的方法,它是所有 class 的 父级。 equals 和 hashCode 用于定义特定的 class 对象不同于来自相同 class 的其他对象并查找哈希值。(如果您调用其他 Java 集合 classes用它来存储这些对象)。 通常,如果您在父 class 之上有不同的行为或字段,我们会创建子 class。所以,child class 应该有更多的字段,最好在 child class.

中实现 equals 和 hashCode

如果不在子 class 中实现 equals 和 hashCode,将不会出错。

让我们假设产品的哈希码是从产品独有的属性中派生出来的。如果 2 个对象具有相同的哈希码,我们还将假设它们是相等的。在这种情况下:

public abstract class BaseEntity {

  public abstract int hashCode();

  @Override
  public boolean equals(Object object) {
      return this.hashCode() == object.hashCode();
  }
}

public class Product extends BaseEntity {

  @Override
  public int hashCode() {
    return someValueDerivedFromProductProperties;
  }
}

这意味着所有扩展 BaseEntity 的 类 必须定义 hashCode 的实现,并且如果返回的 hashcode 值相等则被认为是相等的