使用 List 对象覆盖 POJO 上的 equals 和 hashCode

Overriding equals and hashCode on a POJO with a List object

我有 2 个像这样的 POJO

public class Element{
   private String name;
   private int number;
   //GETTERS AND SETTERS
}

public class Container{
    private String subject;
    private String email; 
    private List<Element> elements;
    //GETTERS AND SETTERS

}

并且我需要验证两个 Container 对象是否相同。我看了看,发现 apache commons 有 HashCodeBuilder and EqualsBuilder 可以帮助覆盖这些方法。这个想法是那些构建器方法使用 Object 中的所有元素来确定 HashCode 和两个对象的相等性。问题是,如果您看到示例代码,它看起来像这样:

public boolean equals(Object obj) {
   if (obj == null) { return false; }
   if (obj == this) { return true; }
   if (obj.getClass() != getClass()) {
     return false;
   }
   MyClass rhs = (MyClass) obj;
   return new EqualsBuilder()
                 .appendSuper(super.equals(obj))
                 .append(field1, rhs.field1)
                 .append(field2, rhs.field2)
                 .append(field3, rhs.field3)
                 .isEquals();
  }

如何附加 List<Element> elements?我是否需要创建另一种方法来将整个 List 解析为 String 才能工作?谢谢!

简短版本:

可以,可以使用EqualsBuilderHashCodeBuilderappend方法。

长版:

List.equals(Object) 方法比较列表中的所有元素。请参见 javadoc

Compares the specified object with this list for equality. Returns true if and only if the specified object is also a list, both lists have the same size, and all corresponding pairs of elements in the two lists are equal. (Two elements e1 and e2 are equal if (e1==null ? e2==null : e1.equals(e2)).) In other words, two lists are defined to be equal if they contain the same elements in the same order. This definition ensures that the equals method works properly across different implementations of the List interface.

因此您可以使用 append(elements, rhs.elements) 来比较列表。

List.hashCode()也使用了元素的hashCode,所以也可以使用HashCodeBuilderappend方法。 javadoc 表示:

Returns the hash code value for this list. The hash code of a list is defined to be the result of the following calculation:

int hashCode = 1;
for (E e : list)
    hashCode = 31*hashCode + (e==null ? 0 : e.hashCode());

我相信 Apache Commons 和 IDE 自动生成的代码都是基于 Joshua Block 在他的书 Effective Java.

中的指导方针

如果您使用诸如 Eclipse 之类的 IDE,您可以通过选择要包含在计算中的字段来自动生成 equals() 和 hashCode()。 Eclipse 甚至让你 use your own custom equals() and hashCode() builders,或 Apache Commons 就此而言。

我也有同样的问题 you.I 尝试生成 equals()、hashCode() 和 toString() 方法,并且代码运行良好。 这是我的代码:

public class EmployeeIncomeTaxRespiteDto extends AbstractDto {

private static final long serialVersionUID = 2305082424321176578L;

private Integer employeeId;

private String employeeName;

private List<IncomeTaxRespiteSelectDto> incomeTaxRespiteList;

@Override
public boolean equals(Object object) {
    return EqualsBuilder.reflectionEquals(this, object);
}

@Override
public int hashCode() {
    return HashCodeBuilder.reflectionHashCode(this);
}

@Override
public String toString() {
    return "EmployeeIncomeTaxRespiteDto [employeeId=" + employeeId + ", employeeName=" + employeeName + ", incomeTaxRespiteList=" + incomeTaxRespiteList + "]";
}

}