Überschreiben der Methode equals beim Umgang mit der Vererbung

Ich habe gelesen, wie man die Equals-Methode am besten überschreibt, wenn man sich mit Unterklassen befasst, und hier habe ich einige Beiträge gefunden. Sie empfehlen verschiedene Methoden zum Implementieren einer Lösung mit instanceof oder getClass (), um Objekte verschiedener Unterklassen zu vergleichen.

In Bezug auf Effective Java ist mein Verständnis jedoch (und ich bin neu in diesem Bereich, so dass ich mich möglicherweise irre!). Bloch argumentiert, dass beide letztendlich problematisch sein können: „Es gibt keine Möglichkeit, eine instanziierbare Klasse zu erweitern und einen Wert hinzuzufügen Bestandteil unter Beibehaltung des gleichen Vertrags, es sei denn, Sie sind bereit, auf die Vorteile der objektorientierten Abstraktion zu verzichten. “ Dann empfiehlt es sich, „die Komposition der Vererbung vorzuziehen“.

Ich habe es also mit dieser Klassenhierarchie zu tun: AbstractClass, ConcreteClass1 und ConcreteClass2. ConcreteClass1 erweitert AbstractClass und ConcreteClass2 erweitert ConcreteClass1. Momentan überschreibt nur AbstractClass die equals-Methode.

Also in 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);
        }

    }

Und in ConcreteClass1 habe ich:

public class ConcreteClassOne extends AbstractClass
{
  private final AbstractClass parent;

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

    parent = aParent;
  }

}

Endlich in ConcreteClassTwo habe ich:

public class ConcreteClassTwo extends ConcreteClassOne
{
  private static int nextTrackingNo = 0;

  private final int trackingNo;

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

    trackingNo= getNextTrackingNo();
  }
}

Ich glaube, ich muss die Methode equals sowohl in ConcreteClassOne als auch in ConcreteClassTwo überschreiben, um die signifikanten Felder parent und trackingNo einzuschließen. Ich darf das Design nicht ändern, daher ist die Verwendung der Komposition keine Option. Irgendwelche Vorschläge?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage