11.4 Stack, der Stapel
 
Die Klasse Stack repräsentiert einen Stapelspeicher, auch »Keller« genannt, der als LIFO (Last-In-First-Out)-Datenstruktur bekannt ist. Beim Hinzufügen von Elementen wächst die Datenstruktur dynamisch. Die Klasse Stack ist eine Erweiterung der Klasse Vector – wir diskutieren später noch diese prickelnde Entscheidung –, womit die Klasse zusätzliche Funktionalität besitzt, beispielsweise die Fähigkeit der Aufzählung und des wahlfreien Zugriffs auf Kellerelemente.
Beispiel Füge in den Stack zwei Strings ein und lese sie wieder aus.
Stack s = new Stack();
s.push( "Michaela" );
s.push( "Kerstin" );
String s1 = (String)s.pop();
String s2 = (String)s.pop();
|
11.4.1 Die Methoden von Stack
 
Stack besitzt nur wenige zusätzliche Methoden verglichen mit dem Vektor.
class java.util.Stack
extends Vector
|
|
Stack()
Der Konstruktor erzeugt einen Stack der Größe null. |
|
boolean empty()
Testet, ob Elemente auf dem Stapel vorhanden sind. |
|
Object push( Object item )
Element item wird auf den Stapel gebracht. |
|
Object pop()
Holt das letzte Element vom Stapel. EmptyStackException signalisiert einen leeren Stapel. |
|
Object peek()
Das oberste Element wird nur vom Stapel gelesen, aber nicht wie bei pop() entfernt. Bei leerem Stapel wird eine EmptyStackException ausgelöst. |
|
int search( Object o )
Sucht im Stapel nach dem obersten Eintrag, der mit dem Objekt o übereinstimmt. Gibt den Index zurück oder -1, falls das Objekt nicht im Stapel ist. 1 bedeutet, dass der gesuchte Eintrag ganz oben auf dem Stapelspeicher liegt, 2 bezeichnet die zweitoberste Position und so weiter. Die Zählweise ist ungewöhnlich, denn sie ist nicht nullbasiert wie alle anderen Funktionen, die mit Positionen arbeiten. |
Hinweis Exceptions von Stack: Im Gegensatz zu Vector kann Stack die Exception EmptyStackException erzeugen, um einen leeren Stapel zu signalisieren. Durch einen Rückgabewert null ist ein Fehlschlag nicht angezeigt, da null ein gültiger Rückgabewert sein kann.
|
11.4.2 Ein Stack ist ein Vektor – aha!
 
Eine genaue Betrachtung der Klasse Stack zeigt den unsinnigen und falschen Einsatz der Vererbung. Stack erbt alle Methoden von Vector und damit viele Funktionen, die im krassen Gegensatz zu den charakteristischen Eigenschaften eines Stapels stehen. Dazu zählen unter anderem die Methoden elementAt(), indexOf(), insertElementAt(), removeElementAt(), setElementAt() und weitere.
Für eine Änderung ist es aber nun aufgrund der Wahrung der Abwärtskompatibilität zu spät und die Implementierung bleibt. Sie hätte mit einem internen Vector oder einer ähnlichen Datenstruktur erfolgen müssen. Bleibt die Frage, warum sich der Autor Jonathan Payne für jene Variante entschieden hat. Aus Sicht der Softwaretechnik ist die Frage nicht so leicht zu beantworten. Hier stehen sich Kaufen (Delegation oder Komposition, also Verwenden eines Objekts) oder Erben (also Erweitern einer Klasse) gegenüber. Das Einzige, was wir als Programmierer aus diesem Missgeschick lernen können, ist die gründliche Analyse der Klassenbeziehungen. In einem Konflikt zwischen Kaufen und Erben sollte immer Kaufen statt Erben eingesetzt werden. Im Übrigen ist Jonathan Payne auch Autor der Klasse Vector.
|