Java Standard: Wrapperklassen


Was ist der Sinn von Wrapperklassen?Bearbeiten

Wrapperklassen ("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 StringBearbeiten

Beispiele 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 OrdinaltypBearbeiten

Beispiele für die Wandlung von String -> Ordinaltyp:

  String s = "10";
  int   i = Integer.parseInt( s );
  float f = Float.parseFloat( s );

Umwandlung in andere ZahlensystemeBearbeiten

Mit 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/AutounboxingBearbeiten

In 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?Bearbeiten

WrapperKlassen 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.