将超类合并到Guava Objects.hashcode()实现的正确方法?
可能是一个愚蠢的问题,但我不想搞砸了。 假设我有两个Java类, Class1
和Class2
,其中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()); }