Programmeren in Java/Boxing en Unboxing
In het basisgedeelte van deze cursus hebben we al primitieve datatypes gezien. In dit hoofdstuk gaan we spreken over hun wrapperklassen en wat er wordt bedoeld met boxing en unboxing. Wrapperklassen zijn klassen 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 klassen komen dan wel met een een aantal methodes om makkelijker te kunnen werken met deze primitieve datatypes.
primitief datatype | wrapperklasse |
---|---|
boolean | Boolean |
byte | Byte |
char | Character |
double | Double |
float | Float |
int | Integer |
long | Long |
short | Short |
Boxing
[bewerken]Boxing betekent dat een waarde van een primitief datatype wordt omgezet in een instantie van zijn wrapperklasse. 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 integerwaarde te hebben om een Integer-object aan te maken, je kunt ook een String veranderen in een Integer-object op deze manier. 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);
Dit is omdat de constructor altijd een nieuw object aanmaakt, terwijl de statische methode veelgebruikte waarden kan cachen.
Unboxing
[bewerken]Als Boxing betekent dat je een primitieve waarde omzet in een object, betekent unboxing natuurlijk het omgekeerde.
Integer integerObject = Integer.valueOf(10);
int primitiveInteger = integerObject.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 in 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 voor boxing of unboxing in de meeste gevallen niet hoeft aan te roepen en dat de compiler die bij het compileren de gewenste aanroepen gewoon toevoegt. Dus in de plaats van het volgende:
Integer integerObject = Integer.valueOf(10);
int primitiveInteger = integerObject.intValue();
Kun je ook gewoon dit doen:
Integer integerObject = 10;
int primitiveInteger = integerObject;
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 vraagt ook meer werk dan tussen twee primitieve waarden.