在阅读(再次,很久以前应该这样做)正确实施equals和hashcode之后,我得出了这些结论,这对我有用:
如果在 JDK 7 之前:更喜欢使用 Apache commons equalsbuilder 和 hashcodebuilder。(或番石榴)。他们的 javadocs 包含如何以良好方式使用它们的示例。
如果 JDK 7++:使用新的 Objects 实用程序类
但是,如果为 hibernate 编写一些特殊要求,则会出现一些特殊要求(请参阅下面的源代码),其中推荐使用instanceof而不是getClass,因为 hibernate 创建了延迟加载的子类的代理。
但据我了解,如果这样做会出现另一个潜在问题:使用 getClass 的原因是为了确保 equals 合约的对称属性。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.*
并且通过使用instanceof,可能不是对称的。示例:B 扩展 A。A 的 equals 对 A 进行 instanceof 检查。B 的 equals 对 B 进行 instanceof 检查。给 A a 和 B b:
a.equals(b) --> true b.equals(a) --> false
如何在不丢失对称属性的情况下使用休眠实现等于?使用getClass时我似乎不安全,使用instanceof时我不安全?
答案是永远不要向子类添加重要成员,然后安全地使用 instanceof(对于休眠)?
我阅读的资料来源:
在 Java 中覆盖 equals 和 hashCode 时应该考虑哪些问题?
Josh Blochs 优秀著作《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