equals と hashcode を正しく実装することを読んだ後 (これもずっと前にこれを行うべきでした)、次の結論に達しました。
JDK 7 より前の場合: Apache commons equalsbuilder および hashcodebuilder を使用することをお勧めします。(またはグアバ)。それらの javadoc には、それらを適切に使用する方法の例が含まれています。
JDK 7++ の場合: 新しい Objects ユーティリティ クラスを使用します。
ただし、hibernate 用に作成する場合、いくつかの特別な要件が表示されます (下のソースを参照)。その中には、hibernate が遅延ロードされるサブクラスのプロキシを作成するため、 getClassの代わりにinstanceofを使用することをお勧めします。
しかし、私が理解しているように、これを行うと別の潜在的な問題が発生します。getClass を使用する理由は、equals 契約の対称プロパティを確保するためです。JavaDoc:
*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.*
また、instanceof を使用することで、対称でなくなる可能性があります。例: B は A を拡張します。A の equals は A の instanceof チェックを行います。B の equals は B の instanceof チェックを行います。A a と B b を与えます。
a.equals(b) --> true b.equals(a) --> false
対称プロパティを失う危険を冒すことなく、hibernate で equals を実装する方法は? getClass を使用するときは安全ではないようで、instanceof を使用するときは安全ではありませんか?
重要なメンバーをサブクラスに決して追加せず、instanceof を使用しても安全であるという答えはありますか (休止状態の場合)?
私が読んだソース:
Java で equals と hashCode をオーバーライドする場合、どのような問題を考慮する必要がありますか?
Josh Bloch の優れた本「Effective Java」の項目 7 と 8、http://web.archive.org/web/20110622072109/http: //java.sun.com/developer/Books/effectivejava/Chapter3.pdf
Java 7 について: http://www.javacodegeeks.com/2012/11/guavas-objects-class-equals-hashcode-and-tostring.html