2016-09-27 7 views
-1

する方法に等しい私は、クラスを持って、私はすでに2匹が等しいかどうかを判断するために、すべての3つのフィールドを比較するequalsメソッドをオーバーライドしているは、単一のクラス

class Dog { 
    String name; 
    int age; 
    String collarType; 
} 

を言います。

ここで2 Dogオブジェクトがあり、2 インスタンスのcollarTypeインスタンスが異なっていても同じ状態になることがあります。したがって、equalsメソッドを使用することはできません。

新しいスキーマ(名前と年齢のみを比較)を使ってコンパレータを作成し、compare(Dog d1, Dog d2)が返す最も良い方法は0ですか?

+1

どのような目的のために、それらが等しいかどうかを知る必要がありますか? – immibis

+0

Guavaには、['Equivalence']というクラスがあります(https://google.github.io/guava/releases/19.0/api/docs/com/google/common/base/Equivalence.html)。この目的。 –

+3

私にとってこれは後方にあります。平等のテストは、名前(変更の可能性が低い)、生年月日(より容易に変更できる年齢ではなく)、不気味に変わる可能性のあるcollarTypeなどの不変フィールドのみを使用する必要があります。 –

答えて

0

あなたが気づいたとおり、平等はユーザーにとって主観的です。しかし、実際の等価性は「正しい」ものだけがオブジェクト上のものでなければなりません(それほど厳密ではないバージョンが正しいと奇妙なので、おそらく完全な等価性です)。これは、どのような状況下でも決して想像もつかないように、不可能であると言うべきです。オブジェクト1とオブジェクト2は、同じであれば異なっています。

他の( '主観的な')メソッドは、コンパレータを使って実現する必要があります。はい、私はコンパレータを使うべきだと思います。さらに、コンパレータの名前を適切に(NameAndAgeComparatorのように)区別する必要があります。これは、DogRaceComparatorとSizeComparatorを想定してサイズ順に並べ替えることができるためです。

コンパレータにstatic equalsメソッドを簡単に与えることができます。このメソッドを使用すると、static imports(equals(dog1,dog2)など)で参照することができます。これらの属性のいずれかが可変である場合にシュタルケルカテゴリにあなたの質問を置く

class Dog 
{ 
    final String name; 
    final Integer age; 
    final String collarType; 

    public boolean equals(Object other) 
    { 
     return this.name.equals(other.name) && 
       this.age.equals(other.age) && 
       this.collarType.equals(other.collarType); 
    } 
} 

:しかし、それはちょうど私の2セント

0

あなたのクラスは、次のようになりますです。

これらのフィールドのいずれかが等しい場合、それは異なるTypeである必要があります。

public interface Named(){public String name(); } パブリックインターフェイスAged(){public String age(TimeUnit timeUnit); } パブリックインターフェイスCollarable {public String collarType(); }

次に、あなたが持っている:

public class Dog implements Named, Aged, Collarable { /* brevity */ } 

と、これらのインタフェースの自然Comparator<Named>Comparator<Aged>Comparator<Collarable>実装を提供します。

0
  • マップやセットに任意の種類のマップを配置すると、イコールとハッシュコードを実装できます。
  • ソートする場合はComparableインターフェイスを実装しますが、実装されているequalsメソッドおよびhashcodeメソッドと互換性があります。
  • equlasおよびhashcodeメソッド以外のフィールドでリストをソート/比較する場合は、コンパレータの実装を使用します。
関連する問題