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 ObjekteJeder 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 — zweiInteger-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