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?
Antwort
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.
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
Wenn Sie niemals diese API-Methoden verwenden, die intern die Methode equals verwenden, ist es nicht notwendig, die Methode equals zu überschreiben. – CrawlingKid
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
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.
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
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.
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!
- 1. Wann muss ich die Methoden "equals" und "hashcode" überschreiben?
- 2. hashcode() und equals() Methode
- 3. Sollte ich Equals und HashCode in einer Domänenklasse implementieren?
- 4. Sollte ich über diese compareTo/equals/hashCode-Implementierung besorgt sein?
- 5. wenn überschreiben gleich und hashcode in java
- 6. equals() und hashCode() -Methoden in Java
- 7. Wenn ich gleichviel überbelaste, sollte ich noch Hashcode in Java überschreiben?
- 8. HashMap überschreiben gleich und Hashcode
- 9. Überschreiben von Hashcode und equals für benutzerdefinierte Klasse
- 10. Wie überschreiben HashCode und equals Methoden in serialisierten Objekt?
- 11. Object Equals - Was ist die Grundlogik für reine Objekte oder Referenztypen, die Equals nicht überschreiben?
- 12. Wie funktioniert die Methode equals() in Java?
- 13. Wie hashCode und equals-Methode implementieren
- 14. In Bezug auf hashcode() und equals()
- 15. Google App Engine, JDO und equals/hashCode
- 16. Sollte ich Objekte injizieren, die für die Ausführung eines Algorithmus benötigt werden? Sollte ich alles spritzen?
- 17. Sollte ViewData niemals verwendet werden?
- 18. können Getter in Equals und Hashcode verwendet werden?
- 19. Wie kann ich zwei serialisierte Java-Objekte wieder miteinander verbinden?
- 20. Generische reflektive Hilfsmethode für equals und hashCode
- 21. Muss ich GetHashCode und Equals in neuen Klassen überschreiben?
- 22. C# Wie wähle ich einen Hashcode für eine Klasse aus, die den Equals-Vertrag verletzt?
- 23. Java: Doppelte Objekte werden zum Set hinzugefügt?
- 24. Liste der Fälle, in denen equals() und hashcode() -Methode intern in Java aufgerufen werden
- 25. Generieren von equals/hashcode/toString mit Annotation
- 26. Warum kann ich die Equals-Methode überschreiben, wenn meine Klasse nichts erbt?
- 27. Sollte ich string.isEmpty() oder "" .equals (string) verwenden?
- 28. Java - Übergeordnete hashCode und toString
- 29. Fix Test mit Methode gleich() und überschreiben diese und hashCode()
- 30. Sollte ich die Java-Namenskonvention verwenden?
Jede anständige IDE (wie Eclipse) wird diese für Sie generieren. –