2012-04-02 7 views
3

私はJava初心者ですので、この方にご負担ください。価値の平等をチェックするには?

Point a = new Point(1, 1); 
Point b = new Point(1, 1); 

私はこれらの2つの点が同じ場所にあるかどうかを確認したい:

class Point { 
    public int x; 
    public int y; 

    public Point (int x, int y) { 
    this.x = x; 
    this.y = y; 
    } 
} 

が、私は2つのインスタンスを作成します。

私はクラスを持っています。明らかに、if (a == b) { ... }は、これが "オブジェクトと等しいと思われるため動作しません"私が望むものではない種類のテスト。

私はif ((a.x == b.x) && (a.y == b.y)) { ... }を行うことができますが、その解決策は気分が良くありません。

どのように2つのPointオブジェクトを使用して、等価であるかどうかをエレガントな方法で調べるにはどうすればよいですか?

class Point { 
    ... 
    @Override 
    public boolean equals(Object obj) { 
    if (!(obj instanceof Point)) return false; 
    Point rhs = (Point)obj; 
    return x == rhs.x && y == rhs.y; 
} 

は、その後、あなたがa.equals(b)を使用することができます。

+0

JDKに既にあるコードを読むのがよいでしょう。 –

答えて

10

標準プロトコルはequals()メソッドを実装することです。

これを実行したら、hashCode()メソッドを実装する必要があります。あなたのようなクラスの場合

は、私は頻繁に使用するApache Commons LangさんEqualsBuilderHashCodeBuilder

class Point { 
    ... 

    @Override 
    public boolean equals(Object obj) { 
    return EqualsBuilder.reflectionEquals(this, obj); 
    } 

    @Override 
    public int hashCode() { 
    return HashCodeBuilder.reflectionHashCode(this); 
    } 
} 
+1

'instanceof'を使用するときに' null'チェックをする必要はありません。引数が 'null'の場合は単に' false'を返します。 – Neet

+0

@RenéJeschke:公正なポイント。 – NPE

+0

これは魅力的な作品です。 私は、オーバーライドされた 'hashCode()'の中で何か気になることがあるのか​​、それともこのようなことが起こるのかどうかは分かりません: 'return(this.x * 1000)+(this.y * -1000)' 。 xとyの両方が0〜500の範囲内にあり、決して負ではありません。 – bos

0

あなたがhashCode()equals()メソッドをオーバーライドすることをお勧めします。 Eclipseを使用している場合は、Source -> Generate hashCode() and equals()..に移動して、Eclipseにこれを実行させることができます。これらのメソッドをオーバーライドした後は、次のように呼び出すことができます。

if(a.equals(b)) { ... }