如何检查复杂对象的自定义相等性?

How to check custom equalness for complex objects?

我有一个复杂的对象,我只想检查特定属性是否相等,如果是,则比较的对象应被视为相等。

我不想覆盖本机 equal() 方法,因为在比较过程中我想省略一些字段。

public class ComplexObject {
   private ObjectA a;
   //...
   prrivate ObjectN n;
}

public class ObjectA {
   private String name;
   private int age;
}

现在,对于每个对象,我都需要某种 Comparator(只是 java.util.Comparator 是用于排序的 class,而不是用于检查相等性)。

boolean compare(ObjectA a1, ObjectA a2) {
   return a1.getName().equals(a2.getName()); //age intentionally left out, just showcase
}

然后我必须将所有 "comparators" 链接在一起并一个接一个地检查,如果一个比较器 returns false 就会中断。这样最后我可以调用 boolean ComplexComparator.compare(complexO1, complexO2) 来比较两个复杂对象,然后比较器链将验证所有包含的成员对象。

可能已经有一个合适的 class 可以为自定义相等比较的这些要求提供基本功能(guava、apache、spring)?还是我必须自己实施一切?

好吧,既然你的问题是是否有任何可用的库可以更轻松地实现比较功能以确定两个对象是否相等...

我知道至少有两个库可以做类似的事情。

一方面,您可以使用 Apache Commons Lang EqualsBuilder

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();
  }

或者您可以使用 Google Guava ComparisonChain

public int compareTo(Foo that) {
     return ComparisonChain.start()
         .compare(this.aString, that.aString)
         .compare(this.anInt, that.anInt)
         .compare(this.anEnum, that.anEnum, Ordering.natural().nullsLast())
         .result();
   }