2012-04-02 14 views
3

Ich bin ein Java-Anfänger, also bitte ertragen mit diesem.Wie kann man auf Gleichheit prüfen?

Ich habe eine Klasse:

class Point { 
    public int x; 
    public int y; 

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

Ich schaffe zwei Instanzen:

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

Ich möchte überprüfen, ob diese zwei Punkte an der gleichen Stelle sind. Der offensichtliche Weg, if (a == b) { ... }, funktioniert nicht, da dies scheint ein "sind die Objekte gleich?" Art von Test, was ich nicht will.

Ich kann if ((a.x == b.x) && (a.y == b.y)) { ... } tun, aber diese Lösung fühlt sich nicht gut an.

Wie kann ich zwei Punktobjekte nehmen und sie auf Gleichheit, auf eine elegante Weise, auf Gleichheit prüfen?

+0

Ein guter Ort zum Starten ist durch Lesen des Codes, der bereits im JDK vorhanden ist. –

Antwort

10

Das Standardprotokoll ist die equals() Methode zu implementieren:

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

Dann können Sie a.equals(b) verwenden. Wenn Sie dies getan haben, müssen Sie auch die Methode hashCode() implementieren.

Für die Klassen wie das Ihre, verwende ich oft Apache Commons Lang ‚s EqualsBuilder und HashCodeBuilder:

class Point { 
    ... 

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

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

Sie brauchen keine 'Null'-Prüfung, wenn Sie' instanceof 'verwenden, wenn das Argument' null 'ist, es gibt nur 'false' zurück. – Neet

+0

@ RenéJeschke: Messepunkt. – NPE

+0

Danke, das funktioniert wie ein Charme. Ich frage mich nur, ob ich in der überschriebenen 'hashCode()' etwas Phantasie machen muss, oder wenn etwas wie das tun wird: 'return (this.x * 1000) + (this.y * -1000)' . Sowohl x als auch y werden innerhalb von 0-500 und niemals negativ sein. – bos

0

Sie werden die hashCode() und equals() Methode außer Kraft setzen wollen. Wenn Sie Eclipse verwenden, können Sie dies für Eclipse tun, indem Sie zu Source -> Generate hashCode() and equals().. gehen. Nachdem Sie diese Methoden überschrieben haben, können Sie anrufen:

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