2011-08-04 6 views
9

GoogleのGuavaコレクション(ComparisonChainObjects)を使い始めました。私のPOJOでは、私は、equalsメソッドをoveridingていますので、私はこれが最初でした:GuidesでCompariesChainをObjects.equal()&& Objects.equal()...に使用するメリットは

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

しかし、私は、私はまた、この使用できることに気づい:

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

をそして、私は時に比較・チェーンを見ることができませんあなたは、特にint型を返す必要がある場合は、私が見ることができる

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

唯一の利点:あなたは簡単にそのような条件をさらに追加することができますよう、より良いでしょう。 2つの追加のメソッド呼び出し(startとresult)があり、noobにはもっと複雑です。

明らかな利点はありますか?比較チェーン私は行方不明ですか?

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

+7

'を書く理由はありません?true:false'をJavaで返します。 – SLaks

+0

ああ、編集しました – NimChimpsky

答えて

18

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

Objects.equalは、等しいかどうかだけを確認できます。

1

あなたのPOJOでメソッドをオーバーライドするという状況では、いくつかの標準的なメソッドに一致するGuavaのツールをいくつか考えます。もし

  • Object.hashCodeが挙げ方法をObjects.hashCodeComparable.compareTo

  • return Objects.hashCode(id, name);等で処理される略で

    • Object.equalsObjects.equalsを用いて処理され、以下のようComparisonChainで処理される:

      public int compareTo(Chimpsky chimpsky) { 
          return ComparisonChain.start() 
           .compare(this.getId(), chimpsky.getId()) 
           .compare(this.getName(), chimpsky.getName()) 
           .result(); 
      } 
      
    9

    ComparisonChainひどいオブジェクトがComparableまたはComparatorインタフェースを実装するのを助けるのに使用される。

    Object.equals()を実装している場合は正しいです。 Objects.equalだけが必要です。しかし、ComparableまたはComparatorを正しく実装しようとしているのであれば、ComparisonChainの方がはるかに簡単です。

    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の実装とは対照的に、

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

    ...おろかあなたが推測するだろうよりも高くなっており、正しくそれを行うのtrickiness:

    を考えてみましょう。 (私はあなたが想像することができるよりもcompareToを混乱させる方法を見てきました)

    +0

    他がnullの場合はどうなりますか? – jon077

    +1

    'Comparable'は' null'を受け入れることはできませんが、 'Comparator'を使用している場合は、' Ordering'として記述すると 'Ordering.nullsFirst()'や 'Ordering.nullsLast() ) 'を使用してヌル値の順序を指定する方法を指定します。 –

    関連する問題