我一直在阅读有关在处理子类时如何最好地覆盖 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。我不允许更改设计,因此不能选择使用合成。有什么建议么?