2016-05-03 9 views
2

Wenn die Objekte I create sind nicht für Vergleiche wie list.contains(new Employee("MM")) verwendet, und wenn auch diese Objekte nur in List s aus einer Datenbank wie List<Employee>employeeList = employeeService.getEmployeeList(); zurück gespeichert werden dann brauche ich equals() und hashCode() in Employee Klasse außer Kraft zu setzen?Effektives Java: sollte ich equals() und hashCode() überschreiben, wenn die Objekte, die ich erstelle, niemals miteinander verglichen werden?

+0

Jede anständige IDE (wie Eclipse) wird diese für Sie generieren. –

Antwort

1

Warum übergeordnete Methode Equals:

Wenn Sie das Objekt Bedürfnisse auf Sammlung i gespeichert werden.e Liste, sollten Sie die Methode equals überschreiben, da Sie die API Methode indexOf, lastIndexOf usw. verwenden werden, da diese API Methoden intern die Methode equals verwenden. Wenn Sie die gleiche Methode nicht überschreiben, können Sie diese Objekte aus den Sammlungen zurückholen, da die Überprüfung der Identität nicht der richtige Weg ist, um das Objekt von Collections zurückzuholen.

Warum überwiegende hashCode Methode:

Wenn Ihr Objekt in einem Satz oder als Schlüsselobjekt in einer Kartensammlung gespeichert werden muss, müssen Sie außer Kraft setzen HashCode und Equals beide becuase beiden Methoden verwendet werden, um das Objekt zu erhalten zurück aus diesen Sammlungen.

+0

wenn ich Objekte in List gespeichert habe, um List-Return von der Datenbank zu behalten, wie zum Beispiel employeeList = EmployeeService.getEmployeeList() und ich benutze nicht indexOf, lastIndexOf, dann muss ich equals() und hashcode() überschreiben? – sawyinwaimon

+0

Wenn Sie niemals diese API-Methoden verwenden, die intern die Methode equals verwenden, ist es nicht notwendig, die Methode equals zu überschreiben. – CrawlingKid

+0

Beachten Sie, dass Sie * niemals * nur '.equals()' und nicht '.hashCode()' überschreiben sollten. Wenn Sie einen überschreiben, müssen Sie den anderen überschreiben, ansonsten sind Ihre Objekte defekt und Sie werden sehr wahrscheinlich mit verwirrenden und schwer zu behebenden Problemen konfrontiert. – dimo414

2

Wenn Sie wissen, dass Sie das Objekt nie als Schlüssel in einem HashMap verwenden werden oder es nie in eine Art von Set einfügen werden, oder nie etwas damit tun, wo Sie andere Objektvergleiche als "sind diese Referenzen, die sich auf die gleiche Instanz beziehen oder nicht ", dann müssen Sie equals() und hashCode() nicht überschreiben.

Und wenn das nicht der Fall ist und Sie sie überschreiben müssen, dann sollten Sie in Betracht ziehen, dass Ihre IDE die Überschreibungen generiert, anstatt sie manuell auszuführen - insbesondere für hashCode(). Beachten Sie, dass Sie beim Generieren der IDE der IDE mitteilen können, welche Felder einbezogen werden sollen und welche Felder nicht einbezogen werden sollen. Dadurch wird die Notwendigkeit, die Überschreibungen manuell zu schreiben, noch weiter reduziert.

+3

Es gibt nichts Falsches daran, Objekte, die '.equals()' und '.hashCode()' nicht überschreiben, in eine 'HashMap' oder' HashSet' zu setzen, solange die Identitätsäquivalenz von solchen Sammlungen erwartet wird Alles gut. – dimo414

2

Nein, Sie müssen .equals() und .hashCode() nicht überschreiben, wenn Sie keine benutzerdefinierte Definition der Gleichheit benötigen. Solange Sie beabsichtigen, jede Instanz Ihrer Klasse als ungleich anderen Instanzen zu behandeln, funktionieren die Standardeinstellungen einwandfrei. Sie können solche Objekte in List s und sogar in Hash-basierten Sammlungen wie HashMap s und HashSet s speichern - beide Klassen haben keine Probleme mit dem Standard Object Äquivalenzbegriff.

Darüber hinaus sollte für viele Klassen nicht diese Methoden überschreiben. Viele gebräuchliche Entwurfsmuster enthalten Klassen, die nicht immer äquivalent sein sollen, wie factories, singletons und state machines. Das Definieren eines benutzerdefinierten Gleichheitsbegriffs für solche Klassen kann seltsame Fehler einführen oder zumindest einfach überflüssig sein.

Auf der anderen Seite value types oder Klassen, die speziell eine strukturierte Darstellung von irgendeiner Art von Daten fast immer sollte seine außer Kraft setzt .equals() und .hashCode() (und möglicherweise Comparable auch implementieren), weil es, was die Nutzer dieser Art von Klassen wahrscheinlich zu erwarten. Das Projekt Auto/Value macht das Erstellen solcher Werttypen wirklich schmerzlos; Wenn das die Art von Klasse ist, die du konstruierst, würde ich dir dringend empfehlen, sie zu benutzen.

2

Wie QuantumMechanic oben gesagt hat, müssen Sie equals() und hashcode() nicht überschreiben.

Jedoch, wenn die Employee-Klasse mit anderen Personen geteilt wird, ist es eine gute Idee, gleiche und Hashcode hinzuzufügen, so dass es für andere Benutzer einfacher ist zu verwenden.

Auch Eclipse kann diese Funktionen mit einem rechten Mausklick generieren -> Quelle -> Gene hashCode() und equals()

Viel Glück!

Verwandte Themen