Home > Informatik > Einführung in die OOP > 8. Exception-Handling > 8.1 MyArrayList, Teil 3

8.1 Die Klasse MyArrayList, Teil 3

Teil 1 - Teil 2 - Teil 3 - Teil 4 - Teil 5 - Teil 6 - Teil 7 - Teil 8

Exkurs 1: Das Prinzip der Redundanz-Vermeidung

Schaut man sich die beiden add()-Methoden der Klasse MyArrayList genauer an, dann stellt man fest, dass der Code nahezu identisch ist:

Vergleich zweier Quelltexte
Autor: Ulrich Helmich 2026, Lizenz: Public domain

In beiden add()-Methoden wird das übergebene Objekt überprüft, ob es den Wert null hat. In der neuen add()-Methode wird zusätzlich der Index überprüft, ob er innerhalb der gültigen Werte liegt. Beide Methoden testen außerdem, ob der übergebene Objekt-Parameter überhaupt ein Objekt ist und nicht etwa ein primitiver Datentyp.

Ein wichtiges Prinzip der OOP besagt nun, dass man solche Redundanzen vermeiden sollte. Eine Möglichkeit, diesen doppelten Code zu vermeiden, ist die Auslagerung eben dieses Codes in eigene Methoden, die dann von den beiden add()-Methoden aufgerufen werden:

MyArrayList, Version 2.4

    private void checkIndex(int index)
    // Neu in Version 2.4
    {
        if (index < 0 || index > size)
            throw new IndexOutOfBoundsException("Index ausserhalb der erlaubten Grenzen: " + index);
    }   

    private void checkObject(Object element)
    // Neu in Version 2.4
   
    {
       if (element == null)
            throw new IllegalArgumentException("Element ist null.");
            
        if (element instanceof Integer || 
            element instanceof Double  ||
            element instanceof Boolean)
            throw new IllegalArgumentException
            ("int-, double- oder boolean-Werte sind nicht erlaubt.");   
    }

    private void checkSize()
    // Neu in Version 2.4
    {
        if (size >= elementData.length)
            grow();

    }

Die letzte Methode checkSize() dient zwar nicht zur Fehlerüberprüfung, sondern verlängert die Liste, falls nötig. Aber auch diese Überprüfung wird von beiden add()-Methoden durchgeführt, daher könnte man sie ebenfalls in eine private Hilfsmethode auslagern.

Die beiden add()-Methoden vereinfachen sich durch diese Auslagerung von Code wie folgt:

    public void add(Object element)
    // Ueberarbeitet in Version 2.4
    {
        checkObject(element);
        checkSize();

        elementData[size] = element;
        size++;
    }

    public void add(int index, Object element)
    // Ueberarbeitet in Version 2.4
    {
        if (element == null)
            throw new NullPointerException("element ist null.");

        checkObject(element);
        checkIndex(index);
        checkSize();

        for (int i = size; i > index; i--)
            elementData[i] = elementData[i - 1];

        elementData[index] = element;
        size++;
    }  

Insgesamt haben wir jetzt zwar deutlich mehr Quelltext produziert, dafür ist dieser Quelltext nun aber wesentlich übersichtlicher und vor allem auch leichter zu warten.

Stellen Sie sich vor, Sie hätten die Aufgabe, das übergebene Objekt oder den übergebenen Index auf weitere Fehlerquellen zu überprüfen, was den Einbau zusätzlicher Exceptions zur Folge hätte. Dann müssten Sie stets beide add()-Methoden modifizieren. Wenn Sie das dann bei einer der beiden Methoden vergessen, haben Sie ein großes Problem.

Durch die Auslagerung in private Hilfsmethoden müssen Sie diese Veränderungen aber nur an einer Stelle im Code vornehmen.

Exkurs 2: Eine heterogene Liste ist möglich

Bisher konnte das interne Array der Klasse MyArrayList beliebige Objekte von beliebigen Klassen speichern. Auch heterogene Listen können so angelegt werden, wie die folgende Methode fuegeObjekteEin() einer Test-Klasse zeigt:

    public void fuegeObjekteEin()
    {
       fuegeEinObjektEin("Name");
       fuegeEinObjektEin("Vorname");
       fuegeEinObjektEin("Straße");
       fuegeEinObjektEin(new Name("Anna","Maibaum"));
       fuegeEinObjektEin(new Punkt(40,60));
    }

Wenn wir das Objekt elementData, also das interne Array unserer Klasse MyArrayList, mit dem BlueJ-Objektinspektor untersuchen, sehen wir, dass die Kapazität (length) der Liste den Wert 5 hat. :

Eine heterogen Liste
Autor: Ulrich Helmich 05/2026, Lizenz: Public domain

Die drei ersten Array-Elemente sind Referenzen auf String-Objekte, das vierte ist eine Referenz auf ein Objekt der Klasse Name, und das fünfte Element ist eine Referenz auf ein Punkt-Objekt.

Natürlich müssen diese Objekte bzw. die zugehörigen Klassen vorher im Projekt vorhanden sein, damit das Testprogramm korrekt funktioniert.

Seitenanfang -
Weiter mit der get()-Methode ...