我有一个带有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方法,这对我的情况最好吗?
任何帮助非常感谢
答案 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项以获取更多信息。