Po przeczytaniu się na (ponownie, powinien zrobić to już dawno temu) równych i hashcode realizacji prawidłowo doszedłem do tych wniosków, że pracuje dla mnie:W jaki sposób zaimplementować wartość równą hibernacji bez ryzyka utraty własności symetrycznej?
Jeśli pre JDK 7: Wolę użyciu Apache Commons equalsbuilder i konstruktora hashcode. (lub Guava). Ich javadocs zawierają przykłady, jak z nich korzystać w dobry sposób.
Jeżeli JDK 7 ++: Użyj nową klasę użytkową Przedmioty
ale jeśli pisanie dla hibernacji pojawić pewne szczególne requistes (patrz źródła niżej) Wśród nich są zalecane użycie instanceof zamiast getClass, ze względu na hibernację tworzenie serwerów proxy podklas, które są obciążone.
Ale jak rozumiem, jeśli to zrobi kolejny potencjalny problem: Powodem użycia getClass jest zapewnienie symetrycznej własności równego kontraktu. JavaDocs:
*It is symmetric: for any non-null reference values x and y, x.equals(y)
should return true if and only if y.equals(x) returns true.*
Używając instanceof, możliwe jest, że nie będzie symetryczny. przykład: B rozciąga się w równych A. nie sprawdzian instancją równych A. B w sposób sprawdzian instancją B. Daj A A i B B:
a.equals (B) -> true b.equals (a) -> false
W jaki sposób zaimplementować wartość równą hibernacji bez ryzyka utraty własności symetrycznej? Wydaje się, że nie jestem bezpieczny podczas korzystania z getClass i nie jestem bezpieczny podczas korzystania z instanceof?
Czy odpowiedź na to, aby nigdy nie dodawać znaczących członków do podklas, a następnie być bezpieczne w użyciu instanceof (do hibernacji, która jest)?
Źródła czytam:
What issues should be considered when overriding equals and hashCode in Java?
Pozycje 7 i 8 w Josh Blochs doskonałej książce "Efektywne Java", http://web.archive.org/web/20110622072109/http://java.sun.com/developer/Books/effectivejava/Chapter3.pdf
O Java 7: http://www.javacodegeeks.com/2012/11/guavas-objects-class-equals-hashcode-and-tostring.html
Dzięki za linki. – Beamie