我有一个像这样的两个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
}
我需要验证两个容器对象是否是相同的。我看了一下,发现ApacheCommons有HashCodeBuilder和EqualsBuilder,它们可以帮助重写这些方法。其思想是,这些构建器方法使用对象中的所有元素来确定两个对象的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
?我是否需要创建另一个方法来将整个列表解析为一个字符串才能工作呢?谢谢!
发布于 2015-04-29 15:38:15
简短版本:
是的,您可以使用append
方法EqualsBuilder
和HashCodeBuilder
。
长篇版本:
List.equals(Object)
方法比较列表中的所有元素。见javadoc
将指定的对象与此列表进行相等比较。返回true当且仅当指定的对象也是一个列表时,这两个列表具有相同的大小,并且两个列表中所有对应的元素对是相等的。(两个元素e1和e2等于if (e1==null?)( e2==null :e1.等于(E2))。换句话说,如果两个列表以相同的顺序包含相同的元素,则定义为相等。此定义确保equals方法在列表接口的不同实现中正常工作。
所以您可以使用append(elements, rhs.elements)
来比较列表。
List.hashCode()
还使用元素的hashCode,因此也可以使用HashCodeBuilder
的append
方法。javadoc说:
返回此列表的哈希代码值。列表的哈希代码被定义为下列计算的结果: int hashCode = 1;for (E : list) hashCode = 31*hashCode + (e==null ?0: e.hashCode());
发布于 2015-05-01 00:25:13
我相信ApacheCommonsand由IDE自动生成的代码都是基于乔舒亚·布洛克在他的书“有效Java”中的指导方针。
在使用IDE (如Eclipse )的情况下,您可以通过选择要在计算中包括哪些字段来自动生成相等()和hashCode()。Eclipse甚至让我们为您提供使用您自己的自定义等于()和hashCode()构建器,或者Apache。
发布于 2018-02-21 08:38:03
我也遇到了同样的问题,我试图生成相等()、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 + "]";
}
}
https://stackoverflow.com/questions/29948144
复制相似问题