Wrapper-Klassen, Autobxing, Unboxing

In Java gibt es für jeden primitiven Datentyp eine entsprechende Wrapper-Klasse (dt. Ummantelungsklasse). Den Sinn dahinter schauen wir uns gleich an.

Hier erstmal eine Auflistung der in Java vorhanden Wrapper-Klassen, die übrigens alle im Paket java.lang zu finden sind:

Wrapper-Klasse Primitiver Typ
Byte byte
Short short
Integer int
Long long
Double double
Float float
Boolean boolean
Character char
Void void

 

Warum das alles?

Der eigentliche Grund hierfür sind Collections. Diese können in Java nur Objekte speichern und keine primitiven Datentypen! Möchten wir also etwas in einer Collection speichern, werden dort nicht die primitiven Datentypen, sondern jeweils deren entsprechende Instanz ihrer Wrapper-Klasse gespeichert.

Jetzt kommt Autoboxing ins Spiel!

Unter Autoboxing versteht man eine automatische Umwandlung des primitiven Datentyps in seine entsprechende Wrapper-Klasse.

Beispiel:

		HashMap<String, Integer> rezept = new HashMap<String, Integer>();
		rezept.put("Eier", 10);
		rezept.put("Milch", 3);
		rezept.put("Mehl", 200);

In diesem Beispiel wird Autoboxing angewendet. Wie oben beschrieben passiert dies aber automatisch, so dass es dem Programmierer nicht auffällt, wenn er es nicht weiß! Da wir uns aber dafür interessieren, wollen wir uns das Beispiel genau anschauen.

Was hat das Beispiel oben mit Autoboxing zu tun?

Wir definieren uns eine Hashmap mit dem Namen rezept. Diese Hashmap muss als erstes Argument einen String haben und als zweites einen Integer. Beachte: Integer, nicht int! Wir übergeben im Beispiel aber keine Objekte vom Typ Integer, bzw. String, sondern lediglich nur primitive Datentypen.

Bemerkung: String wird wir als Array des primitiven Datentyps char aufgefasst!

Ich hatte erwähnt, dass Java Collections immer nur Objekte beinhalten können und keine primitiven Datentypen. Nehmen wir es also ganz streng und fügen, entsprechend unserem obigen Beispiel, nur Objekte in die HashMap ein:

		HashMap<String, Integer> rezept = new HashMap<String, Integer>();
		rezept.put(new String("Eier"), new Integer(10));
		rezept.put(new String("Milch"), new Integer(3));
		rezept.put(new String("Mehl"), new Integer(200));

Dies funktioniert auch…!

Java wandelt den Code aus dem ersten Beispiel in den vom zweiten um. Diese automatische Umwandlung nennt man Autoboxing.

 

Das Gegenteil hierzu stellt Unboxing dar:

Wir holen uns aus einer Collection ein Objekt raus, das wir aber direkt als primitven Datentyp abspeichern.

		int wieVieleEier = rezept.get("Eier");
		int wieVielMilch = rezept.get("Milch");
		int wieVielMehl = rezept.get("Mehl");

Mit Hilfe der get-Methoden holen wir das Integer-Objekt aus unserer HashMap raus. Dieses wird dann von Java automatisch in den primitiven Datentypen (hier int) umgewandelt. Dies ist Unboxing.

 

P.S.:
Um aus einer Instanz einer Wrapper-Klasse den jeweiligen primitiven Datentyp „per Hand“ zu kriegen, also ohne Unboxing zu benutzen, stellt jede dieser Klassen entsprechnde Methoden zur Verfügung.

Bei der Klasse Integer ist es z.B. die „intValue()“, die zu einem Objekt den entsprechenden primitven Datentypen liefert:

		Integer i = new Integer(5); // die Zahl 5 als Objekt der Wrapperklasse
		int fuenf = i.intValue(); // hier holen wir uns diese Zahl als primitven
		                          // Datentypen, den wir aus dem Objekt gewinnen

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.