在java PMD规则中,有一个规则OverrideBothEqualsAndHashcode。
这意味着开发人员必须覆盖equals(Object obj)和hashCode(),而不仅仅是一个。
有人可以解释原因吗?
如果我覆盖并重新定义eqauls(Object obj),我应该在hashCode()中实现什么?
class MyClass() {
public int id;
@Override
public boolean equals(Object obj) {
return id == ((MyClass) obj).id;
}
@Override
public int hashCode() {
// WHAT KIND OF CODE SHOULD I IMPLEMENT HERE?
}
}
答案 0 :(得分:1)
如果您覆盖equals
,则必须覆盖hashCode
,因为hashCode
的合同要求相等的对象具有相同的hashCode
。
对于特定示例的hashCode
实现,这很简单。由于您的相等性由单个int
实例变量确定,hashCode
应该只返回该变量。
这为您提供了尽可能最好的hashCode
实施 - 不相等的MyClass
实例将永远不会具有相同的hashCode
。
@Override
public int hashCode() {
return id;
}