gpt4 book ai didi

java - 处理继承时覆盖equals方法

转载 作者:行者123 更新时间:2023-12-04 04:56:40 27 4
gpt4 key购买 nike

我一直在阅读有关在处理子类时如何最好地覆盖 equals 方法的内容,在这里我找到了很多帖子。他们推荐使用 instanceof 或 getClass() 来比较不同子类的对象来实现解决方案的不同方法。

然而,关于 Effective Java,我的理解是(我对此很陌生,所以我很可能是错的!)Bloch 认为最终两者都可能有问题,“没有办法扩展一个可实例化的类并添加一个值组件同时保留 equals 契约,除非您愿意放弃面向对象抽象的好处”。然后建议“优先组合而不是继承”。

所以我正在处理这个类层次结构:AbstractClass、ConcreteClass1 和 ConcreteClass2。 ConcreteClass1 扩展 AbstractClass 和 ConcreteClass2 扩展 ConcreteClass1。目前只有 AbstractClass 覆盖了 equals 方法。

所以在 AbstractClass 中:

public abstract class AbstractClass {
private String id;


public boolean equals(Object other) {
return other != null && other.getClass().equals(getClass())
&& id.equals(((AbstractClass) other).id);
}

}

在 ConcreteClass1 中,我有:
public class ConcreteClassOne extends AbstractClass
{
private final AbstractClass parent;

public ConcreteClassOne( String anId, AbstractClass aParent )
{
super( anId );

parent = aParent;
}

}

最后在 ConcreteClassTwo 中,我有:
public class ConcreteClassTwo extends ConcreteClassOne
{
private static int nextTrackingNo = 0;

private final int trackingNo;

public ConcreteClassTwo ( String anId )
{
super( anId, null );

trackingNo= getNextTrackingNo();
}
}

所以我相信我需要覆盖 ConcreteClassOne 和 ConcreteClassTwo 中的 equals 方法以包含重要的字段 parent 和 trackingNo。我不允许更改设计,因此不能选择使用组合。有什么建议吗?

最佳答案

最简单的方法是在具体类和抽象类中扩展 equals()。

public class ConcreteClassTwo extends ConcreteClassOne {
public boolean equals(Object other) {
boolean rv = super.equals( other );
if ( other instanceof ConcreteClassTwo ) {
rv = rv && (this.trackingNo == ((ConcreteClassTwo) other).trackingNo);
}
return rv;
}
}

关于java - 处理继承时覆盖equals方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16670824/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com