【发布时间】:2015-07-08 23:59:02
【问题描述】:
我有 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 帮助覆盖这些方法。这个想法是那些构建器方法使用对象中的所有元素来确定 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 才能正常工作?谢谢!
【问题讨论】:
-
如果你可以依赖“List”的“equals”和“hashCode”实现,那么根据这个,(commons.apache.org/proper/commons-lang/apidocs/org/apache/…)我假设你可以将它添加到构建器中。列表的顺序必须相同才能相等,每个元素和存储在列表中的类型也应该有相等和哈希码。
-
有趣...我想,为了让两个具有相同元素但顺序不同的列表被视为相等,我可以对它们进行排序。我会尝试一下,看看它是如何工作的。
-
或者根本不使用
List,如果顺序不重要,使用Set -
小心这个。如果您要处理 大量 量的数据,重复调用 toString()(在示例的 log.info() 中),那么您可能会通过如此深入的检查来创建性能瓶颈。
标签: java apache equals hashcode