Java Standard: Wrapperklassen
Was ist der Sinn von Wrapperklassen?
BearbeitenWrapperklassen ("Hüllklassen") dienen als Verbindungsglied zwischen den Ordinaltypen von Java (byte, short, int, long, float, double, char) und den Klassen in Java und dabei insbesondere der Klasse String. Ein Grundproblem bei der Benutzung von Oberflächen wie AWT und Swing ist, dass bei Eingaben (z.B. in ein Textfeld) immer nur Texte verwaltet werden. Diese Texte müssen in "richtige" Zahlen verwandelt werden, um mit ihnen zu rechnen, und dann wieder in Texte zurückgewandelt werden, um sie in den GUI-Komponenten wieder anzuzeigen. Für dieses Verfahren, was auch als Boxing/Unboxing bekannt ist, werden die Wrapper-Klassen gebraucht. Bis auf die Klasse Character
stammen alle Wrapper-Klassen von java.lang.Number
ab. Es gibt nun zu jedem ordinalen Datentyp eine Wrapperklasse:
Ordinaltyp | Wrapperklasse |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
boolean | Boolean |
char | Character |
Umwandlung von Ordinaltyp nach String
BearbeitenBeispiele für die Wandlung von Ordinaltyp -> String:
int i=10;
Integer ii = new Integer( i );
String s = ii.toString();
oder kürzer:
String s1 = Integer.toString( 10 );
String s2 = Float.toString( 3.14f );
Umwandlung von String nach Ordinaltyp
BearbeitenBeispiele für die Wandlung von String -> Ordinaltyp:
String s = "10";
int i = Integer.parseInt( s );
float f = Float.parseFloat( s );
Umwandlung in andere Zahlensysteme
BearbeitenMit Wrapperklassen ist auch die Umwandlung vom Dezimalsystem in andere Zahlensysteme (Hex, Oct, Dual) möglich. Auch für diese Operationen braucht kein neues Integer-Objekt angelegt werden weil die Operationen static sind.
Beispiele für die Umwandlung (das Ergebnis ist aber ein String!):
System.out.println( "42 = "+Integer.toBinaryString( 42 )+"b (binär)");
System.out.println( "42 = "+Integer.toHexString( 42 )+"h (hexadezimal)");
System.out.println( "42 = "+Integer.toOctalString( 42 )+"o (octal)");
Autoboxing/Autounboxing
BearbeitenIn Java 5.0 wird vom Compiler mittlerweile ein automatisches Boxing/Unboxing vorgenommen. Dadurch ist es unnötig geworden, Ordinaltypen aus den Wrapperklassen mittels den toByte/toShort/toInt/toLong/toFloat/toDouble Methoden zu gewinnen. Andersherum kann einem Objekt einer Wrapperklasse direkt ein Ordinaltyp zugewiesen werden. Dieses Feature verkürzt den Code und macht ihn lesbarer. Allerdings muss nun der Programmierer dafür Sorge tragen, dass nicht ständig zwischen einem Wrapper-Objekt und einem Ordinaltyp hin- und hergewechselt werden muss, da dies enorm viele Resourcen beansprucht.
Beispiel:
Integer i = 5;
byte b = Byte.valueOf("7");
Welche Vor- und Nachteile hat man durch Wrapperklassen?
BearbeitenWrapperKlassen haben den Nachteil, dass der Overhead beim instanziieren geringfügig höher ist, sie sind einige Bytes größer als der dazugehörige primitive Datentyp.
Erstellt man größere Mengen, wirkt sich dies negativ auf die Geschwindigkeit und den benötigten Speicher eines Programmes aus.
Wrapper sind zum Beispiel erforderlich, um threadsichere primitive Datentypen zur Verfügung zu stellen.