Wrapper-klassen in Java

1. Overzicht

Zoals de naam al doet vermoeden, wrapper-klassen zijn objecten die primitieve Java-typen inkapselen.

Elke Java-primitief heeft een bijbehorende wrapper:

  • boolean, byte, short, char, int, long, float, double
  • Boolean, Byte, Short, Character, Integer, Long, Float,Dubbele

Deze zijn allemaal gedefinieerd in het java.lang pakket, daarom hoeven we ze niet handmatig te importeren.

2. Wikkelklassen

"Wat is het doel van een wrapper-klasse?". Het is een van de meest voorkomende Java-interviewvragen.

Eigenlijk, generieke klassen werken alleen met objecten en ondersteunen geen primitieven. Als gevolg hiervan, als we ermee willen werken, moeten we primitieve waarden converteren naar wrapper-objecten.

Het Java Collection Framework werkt bijvoorbeeld exclusief met objecten. Lang geleden toen (vóór Java 5, bijna 15 jaar geleden) er geen autoboxing was en we bijvoorbeeld niet zomaar konden bellen toevoegen (5) op een verzameling van Gehele getallen.

Op dat moment waren die primitief waarden moesten handmatig worden geconverteerd naar overeenkomend wrapper klassen en opgeslagen in verzamelingen.

Tegenwoordig kunnen we met autoboxing gemakkelijk doen ArrayList.add (101) maar intern converteert Java de primitieve waarde naar een Geheel getal voordat u het opbergt in de ArrayList de ... gebruiken waarde van() methode.

3. Omzetting van primitief naar wrapper-klasse

Nu is de grote vraag: hoe converteren we een primitieve waarde naar een corresponderende wrapper-klasse, bijv. een int naar Geheel getal of een char naar Karakter?

Welnu, we kunnen constructor- of statische fabrieksmethoden gebruiken om een ​​primitieve waarde te converteren naar een object van een wrapper-klasse.

Vanaf Java 9 zijn er echter constructors voor veel primitieven met een box, zoals Geheel getal of Lang zijn verouderd.

Zo het wordt ten zeerste aanbevolen om alleen de fabrieksmethoden voor nieuwe code te gebruiken.

Laten we een voorbeeld bekijken van het converteren van een int waarde aan een Geheel getal object in Java:

Geheel getal object = nieuw geheel getal (1); Geheel getal anotherObject = Geheel getal.valueOf (1);

De waarde van() methode retourneert een instantie die het opgegeven int waarde.

Het retourneert waarden in de cache, wat het efficiënt maakt. Het slaat altijd waarden op tussen -128 en 127, maar kan ook andere waarden buiten dit bereik in de cache opslaan.

Evenzo kunnen we ook converteren boolean naar Boolean, byte naar Byte, char naar Karakter, lang naar Lang, zwevend naar Vlotter, en dubbele naar Dubbele. Als we String naar Integer moeten converteren, moeten we echter gebruiken parseInt () methode omdat Draad is geen wrapper-klasse.

Aan de andere kant, om van een wrapper-object naar een primitieve waarde te converteren, kunnen we de overeenkomstige methode gebruiken, zoals intValue (), doubleValue ()enz:

int val = object.intValue (); 

Een uitgebreide referentie vindt u hier.

4. Autoboxing en Unboxing

In het vorige gedeelte hebben we laten zien hoe je handmatig een primitieve waarde naar een object converteert.

Na Java 5, deze conversie kan automatisch worden gedaan door gebruik te maken van de functies autoboxing en unboxing.

"Boxing" verwijst naar het omzetten van een primitieve waarde in een overeenkomstig wrapper-object. Omdat dit automatisch kan gebeuren, wordt het autoboxen genoemd.

Evenzo wanneer een wrapper-object wordt uitgepakt tot een primitieve waarde, staat dit bekend als unboxing.

Dit betekent in de praktijk dat we een primitieve waarde kunnen doorgeven aan een methode die een wrapper-object verwachtof wijs een primitief toe aan een variabele die een object verwacht:

Lijstlijst = nieuwe ArrayList (); lijst.add (1); // autoboxing Geheel getal val = 2; // autoboxing

In dit voorbeeld converteert Java automatisch de primitieve int waarde aan de wrapper.

Intern gebruikt het de waarde van() methode om de conversie te vergemakkelijken. De volgende regels zijn bijvoorbeeld equivalent:

Geheel getal = 3; Integer waarde = Integer.valueOf (3);

Hoewel dit de conversie gemakkelijk maakt en codes beter leesbaar zijn, zijn er enkele gevallen waarin we zouden autoboxing niet moeten gebruiken, b.v. binnen een lus.

Net als bij autoboxen, wordt unboxing automatisch gedaan wanneer een object wordt doorgegeven aan een methode die een primitief verwacht of wanneer het wordt toegewezen aan een primitieve variabele:

Geheel getal object = nieuw geheel getal (1); int val1 = getSquareValue (object); // unboxing int val2 = object; // unboxing openbare statische int getSquareValue (int i) {return i * i; }

Eigenlijk, als we een methode schrijven die een primitieve waarde of een wrapper-object accepteert, kunnen we nog steeds beide waarden aan hen doorgeven. Java zorgt voor het doorgeven van het juiste type, b.v. primitief of wrapper, afhankelijk van de context.

5. Conclusie

In deze korte tutorial hebben we het gehad over wrapper-klassen in Java, evenals het mechanisme van autoboxing en unboxing.