2超类1中的可变变量子类上的唯一ID。如何最好地覆盖equals和hashcode方法

时间:2011-12-15 23:56:00

标签: java equals hashcode

我有一个带有int a和int b的超类。这些变量是可变的。这个超类有2个方法可以为从它创建的任何对象实例改变int a和int b的值。

我有一个继承自Superclass(extends)的子类,并且还覆盖了2个超类方法,以添加超类中缺少的改进功能。子类有1个实例变量,它是唯一的id。我想展示超类和子类的equals和hashcode方法的重写。可能不需要做,但我 我想要覆盖一个或两个类的equals和hashcode以适应我的情况。

超类没有唯一的id实例变量。超类对象是唯一的,我想通过将超类int a和int b与超类int a和int b的实例进行比较,在equals和hashcode方法中显示它。这可行吗?我不想使用默认的equals方法,该方法使用两个被比较对象的内存引用来比较相等性。

我还想使用Int c(唯一id)显示子类的对象,将int a和int b显示为唯一 在equals方法中。

我可以在超类equals和子类equals方法中进行等式检查,还是有点无意义?我不想使用默认的内存引用检查,但希望使用我的2个可变int变量(超类)和1个唯一的id(子类)来显示相等或唯一性

如果我覆盖超类equals和子类equals知道相等规则被破坏了,我还是可以仍然需要测试相等性吗?

我可以覆盖supclass equals和hashcode方法,这对我的情况最好吗?

任何帮助非常感谢

1 个答案:

答案 0 :(得分:0)

这里基本上有两种不同的哲学:

a)sub extends super,所以sub.equals()和sub.hashCode()都委托给super.equals()和super.hashCode()

b)每个类负责自己的合同强制执行,sub.equals()和sub.hashCode()将通过getter(super.getXyz())引用它们来考虑父字段。

这两种方法都是有效的。在方法a)中,super.equals()将检查instanceof兼容性,在方法b)中,super.equals()将this.getClass()that.getClass()进行比较。方法a)的问题在于它会给你非对称的equals()比较。在某些情况下,sub.equals(super)将为false,但super.equals(sub)将为true。

阅读Effective Java的第8项和第9项以获取更多信息。