在 Objects.equal() && Objects.equal() 上使用 ComparisonChain 有什么好处?与番石榴

2022-09-05 00:24:35

我刚刚开始使用谷歌的番石榴收藏(ComparisonChain and Objects)。在我的pojo中,我过度使用了equals方法,所以我首先这样做了:

return ComparisonChain.start()
         .compare(this.id, other.id)
         .result() == 0;

但是,我随后意识到我也可以使用这个:

return Objects.equal(this.id, other.id);

而且我看不出什么时候比较链会更好,因为你可以很容易地添加更多的条件,如下所示:

return Objects.equal(this.name, other.name) 
       && Objects.equal(this.number, other.number);

我能看到的唯一好处是,如果你特别需要一个int返回。它有两个额外的方法调用(start和result),对于新手来说更复杂。

我缺少的比较链有明显的好处吗?

(是的,我也用适当的代码覆盖哈希码Objects.hashcode())


答案 1

ComparisonChain允许您通过比较多个属性来检查一个对象是小于还是大于另一个对象(如按多个列对网格进行排序)。
在实现 或 时应使用它。ComparableComparator

Objects.equal只能检查是否相等。


答案 2

ComparisonChain旨在帮助对象实现Compeable或Compolarator接口。

如果你只是在实现Object.equals(),那么你是正确的;Objects.equal 就是你所需要的。但是,如果你试图正确地实现Compeable或Compolarator,那么使用CompolarChain要容易得多。

考虑:

class Foo implements Comparable<Foo> {
   final String field1;
   final int field2;
   final String field3;

   public boolean equals(@Nullable Object o) {
      if (o instanceof Foo) {
         Foo other = (Foo) o;
         return Objects.equal(field1, other.field1)
             && field2 == other.field2
             && Objects.equal(field3, other.field3);
      }
      return false;
   }

   public int compareTo(Foo other) {
      return ComparisonChain.start()
         .compare(field1, other.field1)
         .compare(field2, other.field2)
         .compare(field3, other.field3)
         .result();
   }
 }

而不是实现 compareTo 作为

 int result = field1.compareTo(other.field2);
 if (result == 0) {
   result = Ints.compare(field2, other.field2);
 }
 if (result == 0) {
   result = field3.compareTo(other.field3);
 }
 return result;

...更不用说正确做到这一点的棘手性了,这比你想象的要高。(我看到了比你想象的更多的搞砸比较的方法。


推荐