Java – 基类和子类中的equals方法
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java – 基类和子类中的equals方法,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2048字,纯文字阅读大概需要3分钟。
内容图文
![Java – 基类和子类中的equals方法](/upload/InfoBanner/zyjiaocheng/712/5378374b8eb046fda9c1c69d9fc2ba37.jpg)
我有一个简单的基类,后来由许多单独的类扩展,这可能会引入新的字段,但不一定.我在基类中定义了一个equals方法,但是也为一些子类重写了它.可以在基础/子类中混合定义吗?在我的例子中,它是为了避免代码重复检查相同的字段.
解决方法:
看看Angelika Langer的“Implementing equals() To Allow Mixed-Type Comparison”.
以下是一些问题的简要说明和可能的解决方案:
等同合同说(其中包括):
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;
}
}
有关更高级的问题及其解决方案,请参阅上面提到的文章.
内容总结
以上是互联网集市为您收集整理的Java – 基类和子类中的equals方法全部内容,希望文章能够帮你解决Java – 基类和子类中的equals方法所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。