4 Stimmen

Überschreiben Sie die Methode equals richtig

Mein Lehrer hat mir die Lösung eines gleichwertigen Beispiels gegeben, und die geht so:

@Override
public boolean equals(Object o)
{
    if (this == o) return true;
    boolean result = false;
    if (o instanceof Product)
    {
        Product other = (Product)o;
        result = this.id == other.id;
    }
    return result;
}

die Methode wird für die Klasse Product überschrieben, die ein Attribut id hat, das für jedes Produkt eindeutig ist. Aber ich verstehe die Bedeutung des ersten if nicht, ich denke, dass das zweite if bereits die Einschränkungen des ersten if überprüft. Kann mir jemand ein Beispiel dafür geben, dass dieser Code funktioniert, und dieser hier nicht? Vielen Dank!

@Override
public boolean equals(Object o)
{
    boolean result = false;
    if (o instanceof Product)
    {
        Product other = (Product)o;
        result = this.id == other.id;
    }
    return result;
}

4voto

Esko Luontola Punkte 71758

Beide Codebeispiele funktionieren. Die if (this == o) return true; im ersten Beispiel ist eine Leistungsoptimierung (höchstwahrscheinlich verfrühte Optimierung - Profil immer zuerst) die prüft, ob das Objekt mit sich selbst verglichen wird. In Java wird die == Operator vergleicht, ob es sich bei zwei Objekten um dieselbe Instanz handelt, und nicht, ob es sich um verschiedene Instanzen mit denselben Daten handelt.

Es gibt verschiedene Arten, die Gleichheitsmethode zu schreiben. Hier ist, wie ich es in der Regel tun:

public boolean equals(Object obj) {
    if (obj instanceof Product) {
        Product that = (Product) obj;
        return this.id == that.id;
    }
    return false;
}

Wenn ich weiß, dass mein Code niemals das Objekt mit Objekten anderer Typen oder mit Null vergleichen wird, kann ich den Code sogar wie unten gezeigt schreiben, so dass er eine Ausnahme auslöst, wenn das trotzdem passiert - das würde bedeuten, dass mein Code einen Fehler hat, so dass ich durch frühzeitiges Versagen davon erfahre und ihn früher beheben kann.

public boolean equals(Object obj) {
    Product that = (Product) obj;
    return this.id == that.id;
}

0voto

aioobe Punkte 397211

Sie haben Recht. Die erste if-Anweisung ist überflüssig, da this == o impliziert o instanceof Product y this.id == other.id .

Wenn das Argument die Leistung ist, würde ich sagen, dass es nach verfrühter Optimierung riecht.

0voto

Uchikoma Punkte 71
if (this == o) return true;

Die obige Aussage ist überflüssig.

Genauer gesagt, wird einfach geprüft, ob Sie ein Objekt vergleichen zu sich selbst ... damit der darunter liegende Code übersprungen werden kann. Zum Beispiel:

Foo f = new Foo();
f.equals(f); //the if (this == o) would be true. References the same thing.

Hinweis: Nebenbei bemerkt, wenn man equals überschreibt, sollte man auch hashcode() überschreiben, um den allgemeinen Vertrag für hashcode() einzuhalten - gleiche Objekte müssen den gleichen Hashcode haben (das Gegenteil ist nicht der Fall, da zwei Objekte den gleichen Hash haben können, aber nicht gleich sind).

http://download.oracle.com/javase/6/docs/api/java/lang/Object.html#equals(java.lang.Object

0voto

natros Punkte 690

In eclipse haben Sie die Möglichkeit, "Generate hashCode() and equals()..." (Menü Quelle)

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