Indpakningsklasser i Java

1. Oversigt

Som navnet antyder, indpakningsklasser er objekter, der indkapsler primitive Java-typer.

Hver Java-primitive har en tilsvarende indpakning:

  • boolsk, byte, kort, char, int, lang, flyde, dobbelt
  • Boolsk, byte, kort, karakter, heltal, lang, flydende,Dobbelt

Disse er alle defineret i java.lang pakke, derfor behøver vi ikke importere dem manuelt.

2. Indpakningsklasser

"Hvad er formålet med en indpakningsklasse?". Det er et af de mest almindelige Java-interviewspørgsmål.

I bund og grund, generiske klasser arbejder kun med objekter og understøtter ikke primitiver. Som et resultat, hvis vi vil arbejde med dem, er vi nødt til at konvertere primitive værdier til indpakningsobjekter.

For eksempel fungerer Java Collection Framework udelukkende med objekter. Langt tilbage, da der (før Java 5, næsten 15 år tilbage) ikke var nogen autoboxing, og vi for eksempel ikke bare kunne ringe tilføj (5) på en samling af Heltal.

På det tidspunkt de primitiv værdier, der skal konverteres manuelt til tilsvarende indpakningsklasser og opbevares i samlinger.

I dag med autoboxing kan vi nemt gøre det ArrayList.add (101) men internt konverterer Java den primitive værdi til en Heltal inden opbevaring i ArrayList bruger Værdi af() metode.

3. Primitiv til konvertering af indpakningsklasse

Nu er det store spørgsmål: hvordan konverterer vi en primitiv værdi til en tilsvarende indpakningsklasse f.eks. en int til Heltal eller a char til Karakter?

Vi kan enten bruge konstruktør- eller statiske fabriksmetoder til at konvertere en primitiv værdi til et objekt i en indpakningsklasse.

Fra og med Java 9, men konstruktører til mange primære primer som f.eks Heltal eller Lang er udfaset.

Det anbefales stærkt at kun bruge fabriksmetoderne på ny kode.

Lad os se et eksempel på konvertering af en int værdi til en Heltal objekt i Java:

Heltalsobjekt = nyt heltal (1); Integer anotherObject = Integer.valueOf (1);

Det Værdi af() metoden returnerer en instans, der repræsenterer den specificerede int værdi.

Det returnerer cachelagrede værdier, hvilket gør det effektivt. Den cachelagrer altid værdier mellem -128 og 127, men kan også cache andre værdier uden for dette interval.

På samme måde kan vi også konvertere boolsk til Boolsk, byte til Byte, char til Karakter, lang til Lang, flyde til Flyde, og dobbelt til Dobbelt. Skønt hvis vi skal konvertere streng til heltal, er vi nødt til at bruge parseInt () metode fordi Snor er ikke en indpakningsklasse.

På den anden side, for at konvertere fra et indpakningsobjekt til en primitiv værdi, kan vi bruge den tilsvarende metode som f.eks intValue (), doubleValue ()etc:

int val = object.intValue (); 

En omfattende reference kan findes her.

4. Autoboxing og Unboxing

I det foregående afsnit viste vi, hvordan man manuelt konverterer en primitiv værdi til et objekt.

Efter Java 5, denne konvertering kan ske automatisk ved hjælp af funktioner kaldet autoboxing og unboxing.

"Boksning" henviser til konvertering af en primitiv værdi til et tilsvarende indpakningsobjekt. Fordi dette kan ske automatisk, er det kendt som autoboxing.

Tilsvarende når et indpakningsobjekt pakkes ud til en primitiv værdi, kaldes dette unboxing.

Hvad dette betyder i praksis er, at vi kan overføre en primitiv værdi til en metode, der forventer et indpakningsobjekteller tildel en primitiv til en variabel, der forventer et objekt:

Liste liste = ny ArrayList (); list.add (1); // autoboxing Heltal val = 2; // autoboxing

I dette eksempel konverterer Java automatisk det primitive int værdi til indpakningen.

Internt bruger den Værdi af() metode til at lette konverteringen. For eksempel er følgende linjer ækvivalente:

Heltalsværdi = 3; Heltalsværdi = Heltal.værdiOf (3);

Selvom dette gør konvertering let og koder mere læselige, er der nogle tilfælde hvor vi bør ikke bruge autoboxing f.eks. inde i en løkke.

I lighed med autoboxing udføres unboxing automatisk, når et objekt sendes til en metode, der forventer en primitiv, eller når den tildeles den til en primitiv variabel:

Heltalsobjekt = nyt heltal (1); int val1 = getSquareValue (objekt); // unboxing int val2 = objekt; // unboxing public static int getSquareValue (int i) {return i * i; }

I bund og grund, hvis vi skriver en metode, der accepterer en primitiv værdi eller et indpakningsobjekt, kan vi stadig videregive begge værdier til dem. Java sørger for at passere den rigtige type, f.eks. primitiv eller indpakning afhængigt af kontekst.

5. Konklusion

I denne hurtige vejledning talte vi om indpakningsklasser i Java samt mekanismen til autoboxing og unboxing.