在阅读this article之后,我弯向于不完全覆盖equals()和hashCode()。
在该文章的摘要中,关于所有栏目的无eq / hC,唯一的结果是我无法进行比较操作,如:
并期待正确的结果。
但是我仍然有疑问并且想问一下你的经历是否完全跳过equals和hashCode是不好的做法以及我现在还不知道的其他后果。
只是另一个信息点,我倾向于使用List Collections over Set。而我的假设是,当存储在List中时,我真的不需要覆盖hashCode并且相等。
答案 0 :(得分:3)
完全跳过equals和hashCode是否是一种不好的做法
是。你应该总是覆盖你的equals和hashCode。期。原因是此方法 已存在于您的类中,在Object中实现。事实证明,这种实现是通用的,并且几乎100%的时候它对您自己的对象来说是错误的实现。因此,通过跳过equals / hashCode,您实际上提供了错误的实现,并且(在最好的情况下)会混淆使用这些类的人。它可能是您的同事,或者它可能是您正在使用的某个框架(这可能导致不可预测且难以调试的问题)。
没有理由不实现这些方法。大多数IDE为equals / hashCode提供了一个生成器。您只需要通知IDE有关您的业务密钥。
答案 1 :(得分:3)
你从那篇文章中得到了完全相反的结论。
Hibernate严重依赖于equals正确实现。如果你不这样做会发生故障。
事实上,几乎所有事情都有;包括标准的java集合。
使用持久性时,默认实现不起作用。您应该始终实现equals和hashcode。关于如何做到这一点有一个简单的规则:
始终确保您在equals / hashcode中使用的值是不可变的。如果你将它们传递出去(就像在吸气剂中一样),最好以不可变的形式传递它们。
这个建议会改善你的生活:)
答案 2 :(得分:3)
阅读这篇关于这个主题的非常好的文章:Don't Let Hibernate Steal Your Identity。
文章的结论是这样的:
在使用时,对象标识很难正确实现 对象被持久化到数据库。然而,问题仍然存在 完全来自允许对象存在之前没有id 保存。我们可以通过承担责任来解决这些问题 从对象关系映射框架中分配对象ID 比如Hibernate。相反,可以尽快分配对象ID 对象被实例化。这使对象标识变得简单 没有错误,并减少了域模型中所需的代码量。