Programmeren in Java/Boxing en Unboxing

Uit Wikibooks
Naar navigatie springen Naar zoeken springen

In het basis gedeelte van deze cursus hebben we al primitieve datatypes gezien. In dit hoofdstuk gaan we spreken over hun wrapperklasses en wat er wordt bedoeld met boxing en unboxing. Wrapperklasses zijn klasses die slechts één eigenschap hebben, namelijk een eigenschap met het datatype waarvan de klasse de wrapper is. Bijvoorbeeld voor het primitieve datatype int, bestaat er een wrapper klasse genaamd Integer. Deze klasses komen dan wel met een een aantal methodes om makkelijker te kunnen werken met deze primitieve datatypes.

Het primitieve datatype De wrapper klasse
boolean Boolean
byte Byte
char Character
double Double
float Float
int Integer
long Long
short Short

Boxing[bewerken]

Boxing betekent dat je een primitieve datatype in zijn wrapperklasse doet. Dit doe je door een statische methode van de wrapperklasse te gebruiken. Bijvoorbeeld zo:

int primitiveInteger = 10;
Integer integer = Integer.valueOf(primitiveInteger);

Je hoeft echter geen integer waarde te hebben om een Integer object aan te maken, je kunt ook een String in een Integer object op deze manier veranderen. Natuurlijk op voorwaarde dat de String een getal bevat.

Integer integer = Integer.valueOf("10");

Het is voorlopig ook nog mogelijk om een constructor te gebruiken om een Integer object aan te maken. Dit is echter een verouderde(sinds Java 9) manier om dit te doen en het wordt sterk afgeraden om het via deze weg nog te doen.

Integer integer = new Integer(10);

Unboxing[bewerken]

Als Boxing betekent dat je een primitieve datatype in een object doet, betekent unboxing natuurlijk dat je het eruit haalt.

Integer integer = Integer.valueOf(10);
int primitiveInteger = integer.intValue();

Autoboxing[bewerken]

Methodes oproepen om aan boxing of unboxing te doen vraagt extra werk aan de programmeur en voegt daardoor ook extra code aan je applicatie. Gelukkig voorziet Java ook zoiets als autoboxing. Autoboxing is wat ze syntax sugar noemen, waarbij de programmeur simpelere code kan schrijven, maar waar de compiler de simpelere code aanpast en code toevoegt zodat de code kan doen wat de programmeur wilt dat het moet doen. In dit geval zal autoboxing ervoor zorgen dat je de methodes niet moet oproepen om aan boxing of unboxing te doen en dat de compiler die bij het compileren die methodes gewoon toevoegt. Dus in de plaats van het volgende:

Integer integer = Integer.valueOf(10);
int primitiveInteger = integer.intValue();

Kun je ook gewoon dit doen:

Integer integer = 10;
int primitiveInteger = integer;

Voor- en nadelen[bewerken]

Voordelen:

  • Doordat de primitieve datatypes in een wrapper object zitten kun je ze gebruiken op dezelfde manier als andere objecten. Je kunt ze bijvoorbeeld in ArrayLists bewaren(ArrayList<Integer>)
  • Ze zijn nullable, in tegenstelling tot primitieve datatypes kunnen ze null bevatten.

Nadelen:

  • Boxing en unboxing vragen extra rekenwerk door de computer.
  • Vergelijkingen maken tussen twee objecten vragen ook meer werk dan tussen twee primitieve datatypes.
Informatie afkomstig van http://nl.wikibooks.org Wikibooks NL.
Wikibooks NL is onderdeel van de wikimediafoundation.