使用List对象覆盖POJO上的equals和hashCode

Nac*_*321 3 java apache equals hashcode

我有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

}
Run Code Online (Sandbox Code Playgroud)

我需要验证两个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();
  }
Run Code Online (Sandbox Code Playgroud)

我该List<Element> elements怎么追加?我是否需要创建另一个方法来将整个List解析为字符串以使其工作?谢谢!

小智 6

精简版:

是的,你可以使用append的方法EqualsBuilderHashCodeBuilder.

长版:

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

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

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

List.hashCode()也使用的元素的哈希码,所以也可以使用append的方法HashCodeBuilder.在javadoc中说:

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

int hashCode = 1;
for (E e : list)
    hashCode = 31*hashCode + (e==null ? 0 : e.hashCode());
Run Code Online (Sandbox Code Playgroud)