Die Größe des Reihungsobjekts kann zur Laufzeit nach der Erzeugung nicht mehr verändert werden. Wenn die im aktuellen Klassenparameter angegebene Größe nicht ausreicht, wird von der obigen Implementierung die Ausnahme IllegalStateException ausgelöst. Dieser kann vorgebeugt werden, indem vor add mit der Methode isFull abgefragt wird, ob die Kapazität für ein weiteres Element ausreichen wird.
Eine alternative Implementierung ist vorstellbar, in der add anstatt eine Ausnahme auszulösen, ein neues Reihungsobjekt mit doppelter Größe erzeugt und die Elemente hinüberkopiert werden, etwa so:
if (isFull) { // neue Reihung mit doppelter Länge erzeugen
val temp = new Array[Object](2 * anzahl).asInstanceOf[Array[E]]
for (i <- 0 until anzahl)
temp(i) = inhalt((ältestes + i) % inhalt.length)
inhalt = temp // neue Reihung verwenden
ältestes = 0
jüngstes = anzahl-1 }
Nachteilig ist bei dieser Lösung, dass die vergrößerte Reihung nicht mehr verkleinert wird, falls die vergrößerte Kapazität nicht mehr benötigt wird[1].
Besser ist, eine teuere[2] (private oder veröffentlichte) Methode pack zu haben, die die Speichergröße auf den gegebenen Wert (zurück-) setzt:
def pack(größe: Int) = {
val temp = new Array[Object](größe).asInstanceOf[Array[E]]
for (i <- 0 until anzahl)
temp(i) = inhalt((ältestes + i) % inhalt.length)
inhalt = temp; // neue Reihung verwenden
ältestes = 0;
jüngstes = anzahl-1; }
def pack: Unit = // setzt aufs Minimum
pack(anzahl)
Diese kann dann gegebenenfalls entweder von add (wenn private, etwa mit aktuellem Parameter 2*anzahl) oder vom Benutzer (wenn öffentlich) aufgerufen werden.
[1] ggf. muss hierfür eine Methode pack vereinbart und vom Benutzer aufgerufen werden
[2] Die bisherigen Methoden hatten alle eine konstante Zeitkomplexität: Ihr Zeitaufwand hing nicht von der Anzahl der Elemente ab. Das Kopieren aller Elemente erfordert aber eine lineare Zeitkomplexität.
Version: 5. Dezember 2010
© Prof. Solymosi, 2010, Beuth-Hochschule für Technik Berlin