可能是一个愚蠢的问题,但我不想搞砸了。假设我有两个Java类Class1
和Class2
,其中Class2 extends Class1
。我想在两个类中使用Guava覆盖Object.hashcode()
。对于超类,我有
@Override
public int hashCode() {
return Objects.hashcode(mField1, mField2);
}
对于Class2,实现将Class1成员考虑在内的hashcode()的正确方法是什么?是这样的吗?
@Override
public int hashcode() {
return Objects.hashcode(super.hashcode(), mField3, mField4);
}
SEEMS对我而言,但我正在寻找一些验证。 Joshua Bloch没有在Effective Java中解决这种情况,而Guava文档也没有解决这个问题。
答案 0 :(得分:13)
是的,这看起来是正确的。如果您有Objects.hashCode(f1, f2, f3, f4)
,情况就会一样。如果你看一下实现,就像result += 31 * result + hashcodeOfCurrentObject
。这意味着你的结果将是31 +超级哈希码,它不是完全相同,但不会有问题。
答案 1 :(得分:10)
有效的Java确实解决了这种情况......说你不应该这样做。第8项:
事实证明,这是等同性的基本问题 面向对象语言中的关系。没有办法扩展 可实例化的类并添加值组件,同时保留 等于合同,除非你愿意放弃利益 面向对象的抽象。
(推论:同样的推理适用于hashCode()。)
答案 2 :(得分:0)
虽然Bozho的建议有效,但我更喜欢这种方法:
@Override
public int hashCode() {
return Objects.hashcode(mField1, getParentField1(), getParentField2());
}