[英]Problem with overriding equals() and hashCode() for a List of Double
[英]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和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解析为字符串以使其工作? 谢谢!
精简版:
是的,您可以使用EqualsBuilder
和HashCodeBuilder
的append
方法。
长版:
List.equals(Object)
方法比较列表中的所有元素。 请参阅javadoc
将指定对象与此列表进行比较以获得相等性。 当且仅当指定的对象也是列表时,返回true,两个列表具有相同的大小,并且两个列表中的所有对应元素对都相等。 (如果(e1 == null?e2 == null:e1.equals(e2)),则两个元素e1和e2相等。)换句话说,如果两个列表包含相同顺序的相同元素,则它们被定义为相等。 此定义确保equals方法在List接口的不同实现中正常工作。
所以你可以使用append(elements, rhs.elements)
来比较列表。
List.hashCode()
也使用元素的hashCode,因此也可以使用HashCodeBuilder
的append
方法。 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.