将超类合并到Guava Objects.hashcode()实现的正确方法?

时间:2011-11-23 20:58:37

标签: java guava

可能是一个愚蠢的问题,但我不想搞砸了。假设我有两个Java类Class1Class2,其中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文档也没有解决这个问题。

3 个答案:

答案 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());
}