Home > Informatik > Stufe Q1 > Referenzen > dynamische List

15.42 Quelltext-Analyse, Teil 2

next(), toFirst() und toLast()

Hier der Quelltext der drei manipulierenden Methoden next, toFirst und toLast, die alle den Zeiger auf das aktuelle Element "umbiegen".

 /**
     * Falls die Liste nicht leer ist, es ein aktuelles Objekt gibt und dieses nicht
     * das letzte Objekt der Liste ist, wird das dem aktuellen Objekt in der Liste
     * folgende Objekt zum aktuellen Objekt, andernfalls gibt es nach Ausführung
     * des Auftrags kein aktuelles Objekt, d. h., hasAccess() liefert den Wert
     * false.
     */
    public void next()
    {
       if ((!isEmpty()) && (hasAccess()) && (act != last))
          act = act.nachfolger;
       else
          act = null;
    }
    /**
     * Falls die Liste nicht leer ist, wird das erste Objekt der Liste aktuelles
     * Objekt. Ist die Liste leer, geschieht nichts.
     */
    public void toFirst()
    {
       if (!isEmpty())
          act = first;
    }
    
    /**
     * Falls die Liste nicht leer ist, wird das letzte Objekt der Liste aktuelles
     * Objekt. Ist die Liste leer, geschieht nichts.
     */
    public void toLast()
    {
       if (!isEmpty())
          act = last;
    }
    
    /**
     * Falls es ein aktuelles Objekt gibt (hasAccess() == true), wird das
     * aktuelle Objekt zurückgegeben, andernfalls (hasAccess() == false)
     * gibt die Anfrage den Wert null zurück.
     */
next()

Diese manipulierende Methode setzt den Zeiger act um eine Position weiter nach rechts, in Richtung Listenende. Damit diese Methode funktioniert und nicht zu einem Laufzeitfehler führt, müssen drei Bedingungen erfüllt sein:

1. Die Liste darf nicht leer sein.

Wenn die Liste leer ist, hat act den Wert null. Und wenn von einem null-Objekt das Attribut nachfolger aufgerufen wird, führt das zu einem Laufzeitfehler, denn dieses Attribut existiert nicht. Komischerweise merkt der Compiler das aber noch nicht, daher würde ein solcher fehlerhafter Quelltext ohne Probleme kompiliert.

2. Es muss ein aktuelles Objekt existieren.

Mit next wird der Zeiger act von dem aktuellen Objekt auf den rechten Nachbarn verschoben. Das setzt aber vorraus, dass überhaupt ein aktuelles Objekt vorhanden ist.

3. Das aktuelle Objekt darf nicht das letzte Element der Liste sein.

Wenn act auf das letzte Element der Liste zeigt, wenn also die Bedingung act == last true ist, dann gibt es keinen rechten Nachbarn mehr, auf den act gesetzt werden könnte.

Diese drei Bedingungen werden nun von der komplexen if-Abfrage

 if ((!isEmpty()) && (hasAccess()) && (act != last))

überprüft.

Weiter im Quelltext...

toFirst() / toLast()

Diese manipulierende Methode setzt den Zeiger act auf das erste bzw. letzte Listen-Element. Das funktioniert aber nur dann, wenn die Liste nicht leer ist. Sie muss aus mindestens einem Element bestehen. Daher die Überprüfung am Anfang

if (!isEmpty())

Angenommen, die Liste besteht aus nur einem Element, und das erste Element war noch nicht als "aktuell" markiert. Mit toFirst ändert sich eigentlich nicht viel, nur dass jetzt das erste Element auch gleichzeitig zum aktuellen Element "befördert" wird. Mit toLast würde das erste und einzige Element ebenfalls zum aktuellen Element werden.