переопределение метода равных при работе с наследованием

Я читал о том, как лучше всего переопределить метод 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. Я'Мне не разрешено менять дизайн, поэтому использование композиции не вариант. Какие-либо предложения?

Ответы на вопрос(3)

Ваш ответ на вопрос