переопределение метода равных при работе с наследованием
Я читал о том, как лучше всего переопределить метод equals при работе с подклассами, и здесь я нашел довольно много постов. Они рекомендуют различные способы реализации решения с использованием instanceof или getClass () для сравнения объектов разных подклассов.
Однако в отношении «Эффективной Java» мое понимание таково (и я новичок в этом, поэтому я вполне могу ошибаться!) Блох утверждает, что в конечном итоге оба могут быть проблематичными: «Невозможно расширить инстанцируемый класс и добавить компонент value, сохраняя при этом контракт равных, если вы не хотите отказаться от преимуществ объектно-ориентированной абстракции »., Затем рекомендует «отдать предпочтение композиции, а не наследованию ».
Итак, я имею дело с этой иерархией классов: 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();
}
}
Поэтому я считаю, что мне нужно переопределить метод equals как в ConcreteClassOne, так и в ConcreteClassTwo, чтобы включить значимые поля parent и trackingNo. Я'Мне не разрешено менять дизайн, поэтому использование композиции не вариант. Какие-либо предложения?