Dopo aver letto su (di nuovo, avrebbe dovuto fare questo molto tempo fa) pari e hashcode attuare correttamente sono venuto a queste conclusioni, che funziona per me:Come implementare equals con hibernate senza rischiare di perdere la proprietà simmetrica?
Se pre JDK 7: Preferisco usando Apache Commons equalsbuilder e hashcodebuilder. (o Guava). Le loro javadoc contengono esempi di come usarle nel modo giusto.
Se JDK 7 ++: Utilizzare la nuova classe di utilità oggetti
Ma, se la scrittura per ibernazione appaiono alcuni requistes speciali (vedi fonti più in basso) Tra loro sono l'utilizzo raccomandata di instanceof anziché getClass, a causa dell'ibernazione della creazione di proxy di sottoclassi caricate in modalità lazy.
Ma come ho capito, se si verifica un altro potenziale problema: Il motivo per utilizzare getClass è garantire la proprietà simmetrica del contratto di uguale. 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.*
E utilizzando instanceof, è possibile non essere simmetrici. Esempio: B estende eguali A. A fa un controllo instanceof di uguali A. B non un controllo instanceof di B. Give A ae B B:
a.equals (B) -> vere b.equals (a) -> false
Come implementare equamente con l'ibernazione senza rischiare di perdere la proprietà simmetrica? Sembra che non sono sicuro quando uso getClass e non sono sicuro quando utilizzo instanceof?
È la risposta per non aggiungere mai membri significativi a sottoclassi e quindi essere sicuri nell'uso di instanceof (per l'ibernazione)?
Fonti leggo:
What issues should be considered when overriding equals and hashCode in Java?
Articoli da 7 e 8 in Josh Blochs eccellente libro "Effective Java", http://web.archive.org/web/20110622072109/http://java.sun.com/developer/Books/effectivejava/Chapter3.pdf
A proposito di Java 7: http://www.javacodegeeks.com/2012/11/guavas-objects-class-equals-hashcode-and-tostring.html
Grazie per i collegamenti. – Beamie