Programmeren in Java/Boxing en Unboxing

Uit Wikibooks

Programmeren in Java In ontwikkeling. Revisiedatum: onbekend

Inleiding Redelijk ontwikkeld. Revisiedatum: 22 augustus 2008

Installatie In ontwikkeling. Revisiedatum: 26 decemeber 2020

Hulpmiddelen Nog vrijwel niets. Revisiedatum: 26 decemeber 2020
  1. Introductie Goed ontwikkeld. Revisiedatum: 19 januari 2021
  2. Klassen Redelijk ontwikkeld. Revisiedatum: 22 januari 2021
  3. Package Goed ontwikkeld. Revisiedatum: 28 januari 2021
  4. Private en Public Goed ontwikkeld. Revisiedatum: 27 december 2020
  5. Getters en Setters Goed ontwikkeld. Revisiedatum: 19 januari 2021
  6. Static Goed ontwikkeld. Revisiedatum: 16 maart 2021
  7. Overerving In ontwikkeling. Revisiedatum: 20 januari 2007
  8. Protected Nog vrijwel niets. Revisiedatum: 22 januari 2021
  9. Abstract Nog vrijwel niets. Revisiedatum: 22 januari 2021
  10. Interfaces Nog vrijwel niets. Revisiedatum: 19 januari 2021
  11. Enums Goed ontwikkeld. Revisiedatum: 15 augustus 2020
  12. Generics Nog vrijwel niets. Revisiedatum: 19 januari 2021
  13. Boxing en Unboxing Goed ontwikkeld. Revisiedatum: 22 januari 2021
  14. Optional Nog vrijwel niets. Revisiedatum: 21 december 2020
  15. Functionele interfaces Nog vrijwel niets. Revisiedatum: 19 januari 2021
Appendices

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.
Informatie afkomstig van https://nl.wikibooks.org Wikibooks NL.
Wikibooks NL is onderdeel van de wikimediafoundation.