2009-10-11 12 views
12

Wenn Sie eigene Klassen schreiben, ist es immer notwendig, equals(Object o) zu überschreiben?Sollten wir immer gleich überschreiben?

Wenn nicht, wird automatisch überprüft, ob alle Felder gleich sind? Oder prüft es einfach, ob die beiden Variablen auf dasselbe Objekt zeigen?

Antwort

16

Wenn man eine Klasse schreibt, deren Objekte in irgendeiner Weise verglichen werden sollen, sollte man die Methoden equals und hashCode außer Kraft setzen.

keine explizite equals Methode Bereitstellung führt das Verhalten der equals Methode aus der Oberklasse, und im Fall der Superklasse in erben die Object Klasse zu sein, dann wird es das Verhalten setforth in der Java-API-Spezifikation für die seinen Object Klasse.

Der Rahmenvertrag für ein equals Verfahren bereitgestellt wird in der Dokumentation für die Object Klasse gefunden werden, insbesondere die Dokumentation der equals und hashCode Methoden.

4

Die equals-Methode für die Klasse Object implementiert die höchst mögliche Äquivalenzbeziehung für Objekte; Das heißt, für alle Nicht-Null-Referenzwerte x und y gibt diese Methode true zurück, wenn und nur wenn sich x und y auf dasselbe Objekt beziehen (x == y hat den Wert true).

Um zu testen, ob zwei Objekte im Sinne der Äquivalenz gleich sind (die gleichen Informationen enthalten), müssen Sie die equals() -Methode überschreiben. Sie sollten die equals() -Methode immer überschreiben, wenn der Identity-Operator für Sie nicht geeignet ist Klasse.

Beachten Sie, dass es in der Regel notwendig ist, die Methode hashCode immer dann zu überschreiben, wenn diese Methode überschrieben wird, um den allgemeinen Vertrag für die Methode hashCode beizubehalten, der angibt, dass gleiche Objekte gleiche Hashcodes haben müssen.

5

Nur überschreiben equals(), wenn es Sinn macht. Aber offensichtlich, wenn Sie equals() überschreiben müssen Sie sicherstellen, dass der hashcode() Vertrag nicht gebrochen ist, was bedeutet, wenn zwei Objekte gleich sind, müssen sie den gleichen Hash-Code haben.

Wann ist es sinnvoll? Wenn Object.equals() nicht ausreicht. Das Verfahren kommt grundsätzlich nach unten zu Referenz Identität, also zwei Objekte das gleiche Objekt sind so:

Zahlen sind ein offensichtliches Beispiel, wenn es Sinn macht, weil Integer(10) andere Intger(10) soll gleich.

Ein anderes Beispiel könnte sein, wenn Sie Datenbankdatensätze darstellen. Nehmen wir an, Sie haben Student-Datensätze mit einer eindeutigen Ganzzahl-ID, dann könnte ausreichende Implementierung von equals sein, um einfach die ID-Felder zu vergleichen.

2

Während Sie sich nicht auf eine IDE verlassen sollten, bietet Eclipse diese vordefinierte Funktionalität, indem Sie Alt + Shift + s drücken und die Menüoptionen equals und hashCode auswählen. Es gibt auch eine toString-Option. Effective Java von Josh Bloch hat gute Infos zu diesem Thema. Der Link führt Sie zu dem in Google Books gehosteten Kapitel, in dem dieses Thema behandelt wird.

Verwandte Themen