Wrapper-klasser i Java

1. Oversikt

Som navnet antyder, wrapper-klasser er objekter som innkapsler primitive Java-typer.

Hver Java-primitive har en tilsvarende innpakning:

  • boolsk, byte, kort, røye, int, lang, flyte, dobbel
  • Boolsk, byte, kort, karakter, heltall, lang, flytende,Dobbelt

Disse er alle definert i java.lang pakken, derfor trenger vi ikke å importere dem manuelt.

2. Pakkeklasser

"Hva er hensikten med en emballasjeklasse?". Det er et av de vanligste spørsmålene om Java-intervju.

I utgangspunktet, generiske klasser fungerer bare med objekter og støtter ikke primitiver. Som et resultat, hvis vi ønsker å jobbe med dem, må vi konvertere primitive verdier til omslagsobjekter.

For eksempel fungerer Java Collection Framework utelukkende med objekter. Lang tilbake da (før Java 5, nesten 15 år tilbake) det ikke var noen autoboksing, og vi for eksempel ikke bare kunne ringe legg til (5) på en samling av Heltall.

På den tiden, de primitiv verdiene måtte konverteres manuelt til tilsvarende innpakningsklasser og lagres i samlinger.

I dag, med autoboksing, kan vi enkelt gjøre det ArrayList.add (101) men internt konverterer Java den primitive verdien til en Heltall før du lagrer den i ArrayList bruker verdien av() metode.

3. Primitive til konvertering av innpakningsklasse

Nå er det store spørsmålet: hvordan konverterer vi en primitiv verdi til en tilsvarende innpakningsklasse f.eks. en int til Heltall eller a røye til Karakter?

Vel, vi kan enten bruke konstruktør- eller statiske fabrikkmetoder for å konvertere en primitiv verdi til et objekt i en wrapper-klasse.

Fra og med Java 9, men konstruktører for mange primitiver i bokser som Heltall eller Lang har blitt utfaset.

Det anbefales sterkt å bare bruke fabrikkmetodene på ny kode.

La oss se et eksempel på å konvertere en int verdi til en Heltall objekt i Java:

Heltallobjekt = nytt Heltall (1); Integer anotherObject = Integer.valueOf (1);

De verdien av() metoden returnerer en forekomst som representerer den spesifiserte int verdi.

Den returnerer hurtigbufrede verdier som gjør den effektiv. Den cacher alltid verdier mellom -128 og 127, men kan også cache andre verdier utenfor dette området.

På samme måte kan vi også konvertere boolsk til Boolsk, byte til Byte, røye til Karakter, lang til Lang, flyte til Flyte, og dobbelt til Dobbelt. Selv om vi må konvertere String til Integer, må vi bruke parseInt () metode fordi String er ikke en wrapper-klasse.

På den andre siden, for å konvertere fra et innpakningsobjekt til en primitiv verdi, kan vi bruke den tilsvarende metoden som intValue (), doubleValue ()etc:

int val = object.intValue (); 

En omfattende referanse finner du her.

4. Autoboksing og unboxing

I forrige avsnitt viste vi hvordan man manuelt konverterer en primitiv verdi til et objekt.

Etter Java 5, denne konverteringen kan gjøres automatisk ved å bruke funksjoner som kalles autoboksing og unboxing.

"Boksing" refererer til å konvertere en primitiv verdi til et tilsvarende innpakningsobjekt. Fordi dette kan skje automatisk, er det kjent som autoboksing.

På samme måte, når et innpakningsobjekt pakkes ut til en primitiv verdi, er dette kjent som unboxing.

Hva dette betyr i praksis er at vi kan overføre en primitiv verdi til en metode som forventer et innpakningsobjekteller tilordne en primitiv til en variabel som forventer et objekt:

Listeliste = ny ArrayList (); list.add (1); // autoboxing Integer val = 2; // autoboksing

I dette eksemplet vil Java automatisk konvertere primitivet int verdi til innpakningen.

Internt bruker den verdien av() metode for å lette konverteringen. Følgende linjer er for eksempel ekvivalente:

Heltall = 3; Integer value = Integer.valueOf (3);

Selv om dette gjør konvertering enkelt og koder mer lesbare, er det noen tilfeller der vi skal ikke bruke autoboksing f.eks. inne i en løkke.

I likhet med autoboksing gjøres unboxing automatisk når du sender et objekt til en metode som forventer en primitiv, eller når du tilordner den til en primitiv variabel:

Heltallobjekt = nytt Heltall (1); int val1 = getSquareValue (objekt); // unboxing int val2 = objekt; // unboxing public static int getSquareValue (int i) {return i * i; }

I utgangspunktet, hvis vi skriver en metode som godtar en primitiv verdi eller et innpakningsobjekt, kan vi fremdeles overføre begge verdiene til dem. Java vil sørge for å passere riktig type f.eks. primitiv eller innpakning avhengig av kontekst.

5. Konklusjon

I denne raske opplæringen snakket vi om wrapper-klasser i Java, samt mekanismen for autoboksing og unboxing.


$config[zx-auto] not found$config[zx-overlay] not found