如果我在父类和子类中实现equals()
和hashCode()
,是否有必要在子类中的super.equals()
中调用equals()
,例如
public boolean equals(Object obj) {
if (obj.getClass() != ChildClass.class) {
return false;
}
return super.equals() && this.var == ((ChildClass) obj).var;
}
我假设父类不是Object,并且给出了equals和hashCode的正确定义。
答案 0 :(得分:8)
不,这不是必要的,也可能是错的。实际上,你覆盖equal
的部分原因是因为super.equals
没有给出正确的行为(对吧?)。
或换句话说,如果super.equals
给出了正确的行为,您可能不需要去覆盖它。
但如果你要覆盖equals
,那么是的,你也需要覆盖hashCode
。
答案 1 :(得分:2)
如果你的超类没有实现equals,那么调用super.equals会得到Object实现,它只比较引用,所以在任何正常的equals实现中你要比较一个业务键,它实际上会导致很多假阴性。
也就是说,上面的实现在语义上与Object中的默认等效实现没有任何不同,因为您只是使用==
进行比较。
至于hashCode,如果你重写equals,你真的应该覆盖hashCode以保持两者的契约。例如,如果您使用等于的业务键,则应该对哈希码使用相同的业务键,以便两个相等的对象生成相同的哈希码。