12

Google の Guava コレクション ( ComparisonChainObjects ) を使い始めたところです。私の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を返す必要がある場合に私が見ることができる唯一の利点。これには 2 つの追加のメソッド呼び出し (開始と結果) があり、noob にとってはより複雑です。

私が見逃しているComparisonChainの明白な利点はありますか?

(はい、適切な でハッシュコードをオーバーライドしていますObjects.hashcode())

4

4 に答える 4

22

ComparisonChain複数のプロパティを比較することで、オブジェクトが別のオブジェクトよりも小さいか大きいかを確認できます(複数の列でグリッドを並べ替えるなど)。または
を実装するときに使用する必要があります。ComparableComparator

Objects.equal同等性をチェックすることしかできません。

于 2011-08-04T13:18:45.053 に答える
13

ComparisonChain は、オブジェクトが Comparable または Comparator インターフェースを実装するのを支援するために使用されることを意図しています。

Object.equals() を実装しているだけなら、その通りです。Objects.equal だけで十分です。しかし、Comparable または Comparator を正しく実装しようとしている場合、ComparisonChain を使用すると、そうでない場合よりもはるかに簡単になります。

検討:

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;

...それを正しく行うことのトリッキーさは言うまでもなく、それはあなたが推測するよりも高い. (compareTo を台無しにする方法は、想像以上にたくさんあります。)

于 2011-09-16T18:54:33.070 に答える
2

POJO でメソッドをオーバーライドするという文脈では、Guava のいくつかのツールがいくつかの標準的なメソッドと一致していると思います。

  • Object.equalsObjects.equalsあなたが言及した方法で大まかに使用して処理されます
  • Object.hashCodeObjects.hashCodeのように処理されますreturn Objects.hashCode(id, name);
  • Comparable.compareTo以下のように扱わComparisonChainれます。

    public int compareTo(Chimpsky chimpsky) {
        return ComparisonChain.start()
            .compare(this.getId(), chimpsky.getId())
            .compare(this.getName(), chimpsky.getName())
            .result();
    }
    
于 2011-08-04T13:57:17.853 に答える