Fehler
Sie sollten keine Ausnahme von der equals
o hashCode
Methoden. Die Methoden "equals" und "hashCode" werden überall verwendet, wahlloses Auslösen von Ausnahmen könnte Ihnen später schaden.
AssertionError
Sie sollten niemals werfen AssertionError
direkt. Die Website assert
Anweisungen in eine beliebige Methode ist in Ordnung, da diese Anweisungen nicht ausgeführt werden, wenn Assertions ausgeschaltet sind.
Wann wird überstimmt?
Es kann nicht schaden, diese zu überschreiben und direkt an super.equals()
wenn die Methode der Superklasse Object.equals
.
Wenn es sich bei den beiden zu vergleichenden Objekten um unterschiedliche Typen handelt, können Sie in die Falle der Symmetriebrechung tappen, d. h. wenn x.equals(y)
ist wahr, aber y.equals(x)
falsch ist. Dies kann passieren, wenn y eine Unterklasse von x ist und die equals-Methode für y einen etwas anderen Vergleich durchführen kann. Sie können dies in Ihrer equals-Methode überprüfen, indem Sie if (getClass() != obj.getClass()) return false;
.
Bewährte Praktiken
Leistungsfähiges Java ist hier eine großartige Ressource, insbesondere für die optimale Umsetzung der hashCode()
Methode. Achten Sie darauf, dass Sie die Verträge der folgenden Organisationen lesen und berücksichtigen ist gleich y hashCode die in der Javadoc aufgeführt sind, und stellen Sie sicher, dass Sie, wenn Sie das eine überschreiben, auch das andere überschreiben. Die "Generate hashCode() and equals"-Funktion in Eclipse leistet gute Arbeit bei der Bereitstellung von Methoden, die Sie benötigen. Der folgende Code stammt aus der Javadoc von java.lang.Object .
entspricht dem Vertrag:
- Sie ist reflexiv: Für jeden Referenzwert x, der nicht null ist, sollte x.equals(x) true zurückgeben.
- Sie ist symmetrisch: Für beliebige Referenzwerte x und y, die nicht null sind, sollte x.equals(y) nur dann true zurückgeben, wenn y.equals(x) true zurückgibt.
- Sie ist transitiv: Für beliebige Referenzwerte x, y und z, die nicht Null sind, sollte x.equals(y) true und y.equals(z) true ergeben, dann sollte x.equals(z) true ergeben.
- Sie ist konsistent: Für beliebige Referenzwerte x und y, die nicht Null sind, geben mehrere Aufrufe von x.equals(y) konsistent true oder false zurück, vorausgesetzt, dass keine Informationen, die in Gleichheitsvergleichen der Objekte verwendet werden, geändert werden.
- Für jeden Referenzwert x, der nicht null ist, sollte x.equals(null) false zurückgeben.
hashCode Contract:
- Wenn die Methode hashCode während der Ausführung einer Java-Anwendung mehr als einmal für dasselbe Objekt aufgerufen wird, muss sie stets dieselbe ganze Zahl zurückgeben, vorausgesetzt, dass keine Informationen, die in Gleichheitsvergleichen für das Objekt verwendet werden, geändert werden. Diese Ganzzahl muss nicht von einer Ausführung einer Anwendung zu einer anderen Ausführung derselben Anwendung konsistent bleiben.
- Wenn zwei Objekte gemäß der equals(Object)-Methode gleich sind, muss der Aufruf der hashCode-Methode für jedes der beiden Objekte das gleiche ganzzahlige Ergebnis liefern.
- Es ist nicht erforderlich, dass zwei Objekte, die nach der equals(java.lang.Object)-Methode ungleich sind, beim Aufruf der hashCode-Methode für jedes der beiden Objekte unterschiedliche ganzzahlige Ergebnisse liefern müssen. Der Programmierer sollte sich jedoch darüber im Klaren sein, dass die Erzeugung unterschiedlicher Integer-Ergebnisse für ungleiche Objekte die Leistung von Hashtables verbessern kann.