Sobes.tech
Middle

Wie überschreibt man die Methode equals in Java richtig?

sobes.tech KI

Antwort von AI

// Beispiel für eine minimal korrekte Überschreibung von equals
class MyClass {
    private int id;
    private String name;

    public MyClass(int id, String name) {
        this.id = id;
        this.name = name;
    }

    @Override // Obligatorische Annotation
    public boolean equals(Object o) {
        // 1. Identitätsprüfung
        if (this == o) return true;
        // 2. Null- und Klassenvergleich
        // Verwendung von getClass() für eine strenge Überprüfung
        if (o == null || getClass() != o.getClass()) return false;
        // 3. Typumwandlung
        MyClass myClass = (MyClass) o;
        // 4. Vergleich der bedeutenden Felder
        return id == myClass.id &&
               // Verwendung von Objects.equals zum Vergleich der Objekte (behandelt null)
               Objects.equals(name, myClass.name);
    }
}

Regeln für eine korrekte Überschreibung von equals (gemäß dem Vertrag von Object.equals):

  • Reflexivität: Für jeden Nicht-Null-Wert x muss x.equals(x) true zurückgeben.
  • Symmetrie: Für alle Nicht-Null-Werte x und y muss x.equals(y) true sein, genau dann, wenn y.equals(x) true ist.
  • Transitivität: Für Nicht-Null-Werte x, y und z gilt: Wenn x.equals(y) und y.equals(z) true sind, dann muss auch x.equals(z) true sein.
  • Konsistenz: Mehrfache Aufrufe von x.equals(y) sollten immer dasselbe Ergebnis liefern, solange sich die Vergleichsinformationen nicht ändern.
  • Für jeden Nicht-Null-Wert x muss x.equals(null) false zurückgeben.

Es wird empfohlen, Objects.equals(obj1, obj2) für einen sicheren Vergleich zu verwenden, da es null-Werte korrekt behandelt.

Immer hashCode() überschreiben, wenn equals() überschrieben wird, gemäß dem allgemeinen Vertrag von Object.hashCode: Wenn zwei Objekte gleich sind (equals()), müssen ihre Hash-Codes gleich sein. Das Gegenteil ist nicht erforderlich. Das Nichtbeachten dieses Grundsatzes kann zu fehlerhaftem Verhalten von Hash-basierten Sammlungen (z.B. HashMap, HashSet) führen.

// Beispiel für einen passenden hashCode für MyClass
class MyClass {
    private int id;
    private String name;

    // ... Konstruktor und equals wie oben ...

    @Override
    public int hashCode() {
        // Verwendung von Objects.hash für eine einfache Hash-Berechnung
        return Objects.hash(id, name);
    }
}

Die automatische Generierung der Methoden equals und hashCode ist in IDEs (IntelliJ IDEA, Eclipse) möglich und eine bewährte Praxis.

Verwenden Sie instanceof anstelle von getClass(), nur wenn die Klasse Teil einer Vererbungs-Hierarchie ist und Sie möchten, dass Objekte der Superklasse und der Unterklasse als gleich gelten, wenn sie denselben Zustand haben. In den meisten Fällen ist die Verwendung von getClass() für eine strenge Überprüfung vorzuziehen.