5 Stimmen

Implementierung der Methode "equals" in Java

Dies ist meine Implementierung der gleich-Klasse für eine Coor-Klasse, die nur 2 Ints x und y enthält. wäre dies der richtige Weg der Implementierung dieser Methode?

 public boolean equals(Object obj) {
        if (obj == null || obj.getClass() != this.getClass()) {
            return false;
        }
        Coor temp = (Coor) obj;
        if (temp.x == this.x && temp.y == this.y) {
            return true;
        } else {
            return false;
        }
    }

7voto

Pat Punkte 24608

Sie könnten eine weitere Prüfung auf reflexive Gleichheit (gleich selbst) hinzufügen:

 public boolean equals(Object obj) {

    // Reflexive equality: did I get passed myself?
    if(this == obj){
        return true;
    }

    if (obj == null || obj.getClass() != this.getClass()) {
        return false;
    }

    Coor temp = (Coor) obj;
    return temp.x == this.x && temp.y == this.y;
}

5voto

Bill K Punkte 61074

Ja, das würde es.

Achten Sie auch darauf, Ihre HashCode()-Methode zu überschreiben - überschreiben Sie niemals eine Methode, ohne auch die andere zu überschreiben, da dies Ihre Sammlungen durcheinander bringen wird.

In Ihrem Fall könnte ein Hash verwendet werden, bei dem einfach einer der Ints um 32 Bits verschoben und zum anderen addiert wird, wodurch eine völlig eindeutige Länge entsteht (eine perfekte Hash-Funktion in diesem Fall - keine Kollisionen)

3voto

pcalcao Punkte 15603

Scheint in Ordnung zu sein. Der Kürze halber können Sie das tun:

return temp.x == this.x && temp.y == this.y

Anstelle von

if (temp.x == this.x && temp.y == this.y) {
        return true;
    } else {
        return false;
    }

Bitte denken Sie auch an den Objektvertrag (ernsthaft!).

Siehe die akzeptierte Antwort hier: Welche Aspekte sollten beim Überschreiben von equals und hashCode in Java berücksichtigt werden?

Das kann Ihnen in Zukunft eine Menge Kopfschmerzen ersparen.

1voto

user470714 Punkte 2820

Sehen Sie sich das an:

http://www.javapractices.com/topic/TopicAction.do?Id=17

Wenn dieser Artikel zu detailliert ist, dann ist er kurz und bündig: Ihre Umsetzung ist richtig, aber Sie sollten einige andere Dinge beachten:

  1. Sie müssen auch hashCode implementieren.

  2. equals nicht mehr mit der Identität des Objekts übereinstimmen. Hört sich nicht so an, als ob das ein Problem für Sie wäre.

  3. Sie können die @Override-Anmerkung zu Ihrer equals-Methode hinzufügen.

0voto

Daniel Brockman Punkte 17782

Hier ist ein unkomplizierterer Weg:

public boolean equals(Object other) {
    return other instanceof Coor
      && ((Coor) other).x == x
      && ((Coor) other).y == y
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X