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

可能是一个愚蠢的问题,但我不想搞砸了。 假设我有两个Java类, Class1Class2 ,其中Class2 extends Class1 。 我想使用Guava为两个类重写Object.hashcode() 。 对于超类,我有

 @Override public int hashCode() { return Objects.hashcode(mField1, mField2); } 

对于Class2,实现hashcode()的正确方法是什么,将Class1的成员考虑在内? 是这样的吗?

 @Override public int hashcode() { return Objects.hashcode(super.hashcode(), mField3, mField4); } 

SEEMS对我而言,但我正在寻找一些validation。 Joshua Bloch没有在Effective Java中解决这种情况,而Guava文档也没有。

是的,这看起来是正确的。 如果你有Objects.hashCode(f1, f2, f3, f4) ,它将是相同的。 如果你看一下实现,就像result += 31 * result + hashcodeOfCurrentObject 。 这意味着你的结果将是31 +超级哈希码,这不完全相同 ,但不会有问题。

有效的Java确实解决了这种情况……说你不应该这样做。 第8项:

事实certificate,这是面向对象语言中等价关系的基本问题。 除非您愿意放弃面向对象抽象的好处,否则无法扩展可实例化的类并在保留equals合同的同时添加值组件。

(推论:相同的推理适用于hashCode()。)

虽然Bozho的建议是有效的,但我更喜欢这种方法:

 @Override public int hashCode() { return Objects.hashcode(mField1, getParentField1(), getParentField2()); }