在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?
}
}
如果你覆盖equals
,你必须覆盖hashCode
,因为hashCode
的契约要求相等的对象具有相同的hashCode
。
至于您的特定示例的hashCode
实现,这很简单。由于您的相等性由单个int
实例变量确定,因此hashCode
应该只返回该变量。
这为您提供了最佳的hashCode
实现 - 不相等的MyClass
实例永远不会具有相同的hashCode
。
@Override
public int hashCode() {
return id;
}