サブクラスを扱うときに equals メソッドをオーバーライドする最善の方法について読んでいますが、ここでかなりの数の投稿を見つけました。彼らは、異なるサブクラスのオブジェクトを比較するために、instanceof または getClass() を使用してソリューションを実装するさまざまな方法を推奨しています。
ただし、Effective Java に関しては、私の理解では (私はこれに慣れていないので、間違っている可能性があります!) 最終的にはどちらも問題になる可能性があると Bloch 氏は主張しています。オブジェクト指向の抽象化の利点を放棄したくない場合を除いて、等号契約を維持しながらコンポーネントを作成する必要があります。」次に、「継承よりも構成を優先する」ことをお勧めします。
したがって、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();
}
}
したがって、重要なフィールドparentとtrackingNoを含めるには、ConcreteClassOneとConcreteClassTwoの両方でequalsメソッドをオーバーライドする必要があると思います。デザインを変更することは許可されていないため、構成を使用することはできません。助言がありますか?