Wrapper osztályok Java-ban

1. Áttekintés

Ahogy a neve is sugallja, a burkoló osztályok olyan objektumok, amelyek primitív Java típusokat foglalnak magukba.

Minden Java primitívnek van egy megfelelő burkolója:

  • logikai, byte, rövid, char, int, hosszú, float, double
  • Logikai érték, bájt, rövid, karakter, egész szám, hosszú, úszó,Kettős

Ezeket mind a java.lang csomagot, ezért nem kell őket manuálisan importálnunk.

2. Fóliázó osztályok

"Mi a célja a burkoló osztálynak?". Ez az egyik leggyakoribb Java interjúkérdés.

Alapvetően, az általános osztályok csak objektumokkal működnek, és nem támogatják a primitíveket. Ennek eredményeként, ha együtt akarunk működni velük, akkor a primitív értékeket át kell alakítanunk burkoló objektumokká.

Például a Java Collection Framework kizárólag objektumokkal működik. Régen, amikor (a Java 5 előtt, majdnem 15 évvel ezelőtt) még nem volt autóbox, és mi például nem tudtuk egyszerűen felhívni add (5) gyűjteményén Egész számok.

Abban az időben azok primitív az értékeket manuálisan kell konvertálni megfelelő burkoló osztályok és gyűjteményekben tárolják.

Ma az autoboxolással könnyedén megtehetjük ArrayList.add (101) de belsőleg a Java a primitív értéket konvertálja Egész szám mielőtt a Tömb lista használni a értéke() módszer.

3. Primitív a burkoló osztály átalakítása

Most a nagy kérdés: hogyan alakíthatunk egy primitív értéket egy megfelelő burkoló osztályra pl. an int nak nek Egész szám vagy a char nak nek Karakter?

Nos, akár konstruktorral, akár statikus gyári módszerekkel átalakíthatunk egy primitív értéket egy wrapper osztály objektumává.

A Java 9-től kezdve azonban sok dobozos primitív konstruktorai, mint pl Egész szám vagy Hosszú már elavult.

Így erősen ajánlott csak a gyári módszereket használni új kódokon.

Lássunk egy példát egy int érték egy Egész szám objektum Java-ban:

Egész objektum = új Egész szám (1); Integer anotherObject = Integer.valueOf (1);

A értéke() metódus a megadott értéket reprezentáló példányt ad vissza int érték.

Gyorsítótárazott értékeket ad vissza, ami hatékonyabbá teszi. Mindig -128 és 127 közötti értékeket tárol, de ezen a tartományon kívül más értékeket is tárol.

Hasonlóképpen átalakíthatunk is logikai nak nek Logikai érték, bájt nak nek Byte, char nak nek Karakter, hosszú nak nek Hosszú, úszó nak nek Úszó, és kettős nak nek Kettős. Bár ha a String-et egész számra kell konvertálnunk, akkor használnunk kell parseInt () módszer, mert Húr nem burkoló osztály.

Másrészről, egy burkolóobjektumból primitív értékké konvertáláshoz használhatjuk a megfelelő módszert, mint pl intValue (), doubleValue ()stb:

int val = object.intValue (); 

Átfogó hivatkozás található itt.

4. Autoboxing és Unboxing

Az előző részben bemutattuk, hogyan lehet a primitív értéket manuálisan átalakítani objektummá.

A Java 5 után ez az átalakítás automatikusan elvégezhető az úgynevezett autoboxing és unboxing funkciók használatával.

A „boksz” egy primitív érték megfelelő burkoló objektummá konvertálására utal. Mivel ez automatikusan megtörténhet, az úgynevezett autoboxing.

Hasonlóképpen, ha egy csomagolóobjektumot egy primitív értékre bontunk, akkor ezt kibontásnak nevezzük.

Ez a gyakorlatban azt jelenti, hogy egy primitív értéket átadhatunk egy olyan módszernek, amely egy burkoló objektumra számítvagy hozzárendel egy primitívet egy változóhoz, amely egy objektumra számít:

Lista lista = new ArrayList (); list.add (1); // autoboxing Egész szám val = 2; // autoboxing

Ebben a példában a Java automatikusan átalakítja a primitívet int érték a burkolónak.

Belsőleg a értéke() módszer az átalakítás megkönnyítésére. Például a következő sorok egyenértékűek:

Egész szám = 3; Egész érték = Integer.valueOf (3);

Bár ez megkönnyíti az átalakítást, és a kódok olvashatóbbak, vannak olyan esetek, amikor nem szabad autoboxot használnunk pl. egy hurok belsejében.

Az autoboxoláshoz hasonlóan az unboxing automatikusan végrehajtódik, amikor egy objektumot primitív elvárásnak megfelelő módszerhez adunk át, vagy amikor egy primitív változóhoz rendeljük:

Egész objektum = új Egész szám (1); int val1 = getSquareValue (objektum); // unboxing int val2 = objektum; // unboxing public static int getSquareValue (int i) {return i * i; }

Alapvetően, ha olyan módszert írunk, amely elfogad egy primitív értéket vagy burkoló objektumot, akkor is átadhatjuk mindkét értéket nekik. A Java gondoskodni fog a megfelelő típus átadásáról pl. primitív vagy burkoló a kontextustól függően.

5. Következtetés

Ebben a gyors bemutatóban beszéltünk a Java burkoló osztályairól, valamint az autoboxing és az unboxing mechanizmusáról.