java 子类型_Java – 基类和子类中的equals方法

我有一个简单的基类,后来由许多单独的类扩展,这可能会引入新的字段,但不一定.我在基类中定义了一个equals方法,但是也为一些子类重写了它.可以在基础/子类中混合定义吗?在我的例子中,它是为了避免代码重复检查相同的字段.

解决方法:

以下是一些问题的简要说明和可能的解决方案:

等同合同说(其中包括):

It is symmetric: for any non-null reference values x and y, x.equals(y) should return true if and only if y.equals(x) returns true.

这意味着如果您的子类引入了新字段并且您正在将基类的对象(或不重写equals的另一个子类)与此子类的对象进行比较,则可能会遇到问题.

请勿执行以下操作:

class BaseClass {

private int field1 = 0;

@Override

public boolean equals(Object obj) {

if (obj instanceof BaseClass) {

return field1 == ((BaseClass) obj).field1;

}

return false;

}

}

class BadSubClass extends BaseClass {

private int field2 = 0;

@Override

public boolean equals(Object obj) {

if (obj instanceof BadSubClass) {

return super.equals(obj)

&& field2 == ((BadSubClass) obj).field2;

}

return false;

}

}

因为你得到了

BaseClass baseClass = new BaseClass();

BadSubClass subClass = new BadSubClass();

System.out.println(baseClass.equals(subClass)); // prints 'true'

System.out.println(subClass.equals(baseClass)); // prints 'false'

可能的解决方案:

用类比较替换instanceof-check:

obj != null && obj.getClass() == getClass()

使用此解决方案,BaseClass的对象永远不会等于任何子类的对象.

如果你创建另一个没有equals方法的@Override的SubClass,两个SubClass对象可以相互相等(如果BaseClass.equals检查决定这样)开箱即用,但SubClass对象永远不会等于a BaseClass的对象.

一个好的实施可能如下:

class BaseClass {

private int field1 = 0;

@Override

public boolean equals(Object obj) {

if (obj != null && obj.getClass() == getClass()) {

return field1 == ((BaseClass) obj).field1;

}

return false;

}

}

class GoodSubClass extends BaseClass {

private int field2 = 0;

@Override

public boolean equals(Object obj) {

if (obj instanceof GoodSubClass) {

return super.equals(obj) && field2 == ((GoodSubClass) obj).field2;

}

return false;

}

}

有关更高级的问题及其解决方案,请参阅上面提到的文章.来源:https://www.icode9.com/content-1-463601.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值