【发布时间】:2011-07-11 22:46:33
【问题描述】:
我只是想知道为可变集合覆盖 equals 和 hashCode 是否是个好主意。这意味着如果我将这样的集合插入到 HashSet 中,然后修改该集合,HashSet 将不再能够找到该集合。这是否意味着只有不可变的集合才应该覆盖 equals 和 hashCode,还是 Java 程序员只能忍受这种麻烦?
【问题讨论】:
-
在 OO 层次结构的顶部存在 equals 和 hashCode 是 Java 程序员必须忍受的麻烦。 equals 和 hashCode 本质上是坏的,但不仅仅是因为你提到的原因。我主要在 Java 中工作,做 "OO over immutable objects",即使这样做,equals 和 hashCode 也被破坏了。在大多数情况下,拥有这些方法是没有意义的:不可能满足任何非最终类的 equals 和 hashCode 协定。这在 Effective Java 中有很好的解释。
-
在这里查看我的相关问题,10 次赞成 + 几个最喜欢的:stackoverflow.com/questions/2205565 equals 和 hashCode 除了最简单的情况外,其他任何事情都无法解决您只将一种类型的 immutable 对象(没有继承,没有任何东西)放在集合中。你的案子不是一个简单的案子,你会有很多问题。 OO 层次结构顶部的 equals 和 hashCode 是一个错误,简单明了(但大多数 Java 程序员没有意识到)。
-
@SyntaxT3rr0r - 有一些方法可以在继承链中很好地处理这个问题,请参阅angelikalanger.com/Articles/JavaSolutions/SecretsOfEquals/…。此外,实体对象通常是可变的,但有一些用于这些方法的不可变“id”。所以不,它们不是“从根本上打破所有java”。像所有工具一样,您需要知道如何使用它们。
-
StringBuffer 类和 StringBuilder 类也不会因为可变性而覆盖 equals() 和 hashCode()。
标签: java collections overriding equals hashcode