EMZETT.
Login

Wrapper Classes (Wrapper-Klassen)

Kurz: Eine Klasse, die einen primitiven Datentyp (z. B. eine einfache Ganzzahl) in ein vollwertiges Objekt verpackt — nötig, wenn eine API oder Collection ein Objekt statt eines primitiven Werts erwartet.

Genauer: Primitive Werte allein haben keine Methoden und können nicht in objektbasierten Datenstrukturen wie einer Liste gespeichert werden — eine Wrapper-Klasse gibt dem primitiven Wert eine Objekt-Hülle mit nützlichen Zusatzfunktionen (z. B. String-Umwandlung, Vergleichsmethoden). Viele Sprachen wandeln automatisch zwischen primitivem Wert und Wrapper-Objekt um (Auto(un)boxing), was in der Praxis Performance-Fallen verursachen kann, wenn es unbemerkt sehr häufig passiert.

Im Detail

int primitiv = 5;              // primitiver Wert - kein Objekt
Integer wrapper = 5;            // Wrapper-Objekt - hat Methoden wie .toString()
 
List<Integer> liste = new ArrayList<>();
liste.add(5);   // funktioniert - "5" wird automatisch zu Integer "geboxt"
// liste.add(int) würde NICHT funktionieren - Collections speichern nur Objekte

Jeder primitive Typ hat in Sprachen wie Java eine entsprechende Wrapper-Klasse (int ↔ Integer, double ↔ Double, boolean ↔ Boolean usw.). Der Grund, warum diese Unterscheidung überhaupt nötig ist: Viele objektbasierte Strukturen (Collections, Generics) sind so konzipiert, dass sie ausschließlich mit Objekten (also Referenztypen) arbeiten können, nicht mit primitiven Rohwerten — Wrapper-Klassen schlagen die Brücke zwischen beiden Welten.

Die automatische Umwandlung zwischen primitivem Wert und Wrapper-Objekt (Autoboxing/Auto-Unboxing) macht das im alltäglichen Code meist unsichtbar — man schreibt einfach liste.add(5), ohne selbst new Integer(5) aufzurufen. Das birgt aber zwei Fallstricke:

  • Performance: Jede Boxing-Operation erzeugt (in vielen Fällen) ein neues Objekt im Speicher — passiert das in einer Schleife mit sehr vielen Durchläufen unbemerkt sehr häufig, kann das spürbar langsamer sein als reine primitive Rechnungen.
  • Vergleich mit ==: Wrapper-Objekte sind Referenztypen — zwei Integer-Objekte mit demselben Wert sind nicht zwingend ==-gleich (siehe Vergleichsoperatoren), auch wenn kleine Zahlen in manchen Sprachen aus internen Cache-Optimierungen heraus scheinbar trotzdem gleich erscheinen — ein trügerisches, inkonsistentes Verhalten, das man besser gar nicht erst nutzt und stattdessen konsequent die inhaltliche Vergleichsmethode verwendet.

Siehe auch: Non-primitive Types, byte