首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在带有List对象的POJO上重写等于和hashCode

在带有List对象的POJO上重写等于和hashCode
EN

Stack Overflow用户
提问于 2015-04-29 15:26:13
回答 3查看 6.5K关注 0票数 4

我有一个像这样的两个POJO

代码语言:javascript
运行
复制
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

}

我需要验证两个容器对象是否是相同的。我看了一下,发现ApacheCommons有HashCodeBuilderEqualsBuilder,它们可以帮助重写这些方法。其思想是,这些构建器方法使用对象中的所有元素来确定两个对象的HashCode和相等性。问题是,如果您看到示例代码,它如下所示:

代码语言:javascript
运行
复制
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?我是否需要创建另一个方法来将整个列表解析为一个字符串才能工作呢?谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-04-29 15:38:15

简短版本:

是的,您可以使用append方法EqualsBuilderHashCodeBuilder

长篇版本:

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

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

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

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

返回此列表的哈希代码值。列表的哈希代码被定义为下列计算的结果: int hashCode = 1;for (E : list) hashCode = 31*hashCode + (e==null ?0: e.hashCode());

票数 7
EN

Stack Overflow用户

发布于 2015-05-01 00:25:13

我相信ApacheCommonsand由IDE自动生成的代码都是基于乔舒亚·布洛克在他的书“有效Java”中的指导方针。

在使用IDE (如Eclipse )的情况下,您可以通过选择要在计算中包括哪些字段来自动生成相等()和hashCode()。Eclipse甚至让我们为您提供使用您自己的自定义等于()和hashCode()构建器,或者Apache。

票数 1
EN

Stack Overflow用户

发布于 2018-02-21 08:38:03

我也遇到了同样的问题,我试图生成相等()、hashCode()和toString()方法,并且代码运行良好。这是我的代码:

公共类EmployeeIncomeTaxRespiteDto扩展AbstractDto {

代码语言:javascript
运行
复制
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 + "]";
}

}

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29948144

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档