繁体   English   中英

使用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有HashCodeBuilderEqualsBuilder ,它们有助于覆盖这些方法。 我们的想法是,这些构建器方法使用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解析为字符串以使其工作? 谢谢!

精简版:

是的,您可以使用EqualsBuilderHashCodeBuilderappend方法。

长版:

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

将指定对象与此列表进行比较以获得相等性。 当且仅当指定的对象也是列表时,返回true,两个列表具有相同的大小,并且两个列表中的所有对应元素对都相等。 (如果(e1 == null?e2 == null:e1.equals(e2)),则两个元素e1和e2相等。)换句话说,如果两个列表包含相同顺序的相同元素,则它们被定义为相等。 此定义确保equals方法在List接口的不同实现中正常工作。

所以你可以使用append(elements, rhs.elements)来比较列表。

List.hashCode()也使用元素的hashCode,因此也可以使用HashCodeBuilderappend方法。 javadoc说:

返回此列表的哈希码值。 列表的哈希码被定义为以下计算的结果:

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

我相信IDE的Apache Commons和自动生成的代码都是基于Joshua Block在他的“ Effective Java”一书中的指导原则。

如果您使用Eclipse之类的IDE,则可以通过选择要包含在计算中的字段来自动生成equals()和hashCode()。 Eclipse甚至让你使用你自己的自定义equals()和hashCode()构建器 ,或Apache Commons'。

我也有同样的问题。我试图生成equals(),hashCode()和toString()方法,代码运行良好。 这是我的代码:

公共类EmployeeIncomeTaxRespiteDto扩展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 + "]";
}

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM