【发布时间】:2013-07-22 00:23:44
【问题描述】:
所以我有很多自定义类,它们内部也有使用组合的自定义类。
我的自定义类的变量变化非常频繁,我将它们添加到 HashSets。所以我的问题是当我实现 hashCode - 对于只有不断变化的私有字段的类,我该怎么办?
这是一个自定义类的示例:
public class Cell {
protected boolean isActive;
protected boolean wasActive;
public Cell() {
this.isActive = false;
this.wasActive = false;
}
// getter and setter methods...
@Override
public int hashCode() {
// HOW SHOULD I IMPLEMENT THIS IF THIS custom object is constantly
// being added into HashSets and have it's private fields isActive
// and wasActive constantly changed.
}
// ANOTHER QUESTION Am I missing anything with this below equals implementation?
@Override
public boolean equals(Object object) {
boolean result = false;
if (object instanceof Cell) {
Cell otherCell = (Cell) object;
result = (this.isActive == otherCell.isActive && this.wasActive ==
otherCell.wasActive);
}
return result;
}
【问题讨论】:
-
我猜,仅基于两个布尔变量 hashcode 不能唯一生成。您需要在类中添加一些其他变量。例如单元格的 x 和 y 坐标(仅作为示例)。我猜这不是他类的全部代码。
-
请注意,如果您使用 Cell 作为映射中的键,那么只有这样才会产生问题,因为哈希集合不会知道更改的哈希码。因此,一旦将对象作为键添加到散列集合中,它的散列码就不能改变。您可以为单元格保留一些唯一标识符并将其用作键。
-
这取决于您在哈希集中搜索的内容。您是在搜索特定对象,在这种情况下不实现 hashCode 或 equals,还是在搜索具有特定状态的对象,在这种情况下,您使用您感兴趣的状态变量实现 hashCode 和 equals。不断变化的字段更改不应用于 hashCode 函数,否则对象将“丢失”。
-
为了正确实现 hashcode 和 equals 我建议你阅读 joshua 的 Effective java 中的 hashcode 和 equals 部分。他已经详细解释了这里难以解释的事情。
标签: java equals hashcode abstract-data-type custom-object