Satovi omota na Javi

1. Pregled

Kao što i samo ime govori, klase omota su objekti koji inkapsuliraju primitivne Java tipove.

Svaki Java primitiv ima odgovarajući omot:

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

Sve su to definirane u java.lang paketa, stoga ih ne trebamo uvesti ručno.

2. Razredi omota

"Koja je svrha klase omota?". To je jedno od najčešćih pitanja o intervjuu za Javu.

U osnovi, generičke klase rade samo s objektima i ne podržavaju primitive. Kao rezultat toga, ako želimo raditi s njima, moramo pretvoriti primitivne vrijednosti u objekte omota.

Na primjer, Java Collection Framework radi isključivo s objektima. Davno kad (prije Jave 5, prije gotovo 15 godina) nije bilo automatskog boksanja i mi, na primjer, nismo mogli jednostavno nazvati dodaj (5) na zbirci Cijeli brojevi.

U to vrijeme oni primitivno vrijednosti koje je trebalo ručno pretvoriti u odgovara klase omota i pohranjene u zbirkama.

Danas s automatskim boksom to lako možemo učiniti ArrayList.add (101) ali interno Java pretvara primitivnu vrijednost u Cijeli broj prije nego što ga pohranite u ArrayList koristiti vrijednost() metoda.

3. Primitivna konverzija klase omotača

Sad je veliko pitanje: kako pretvoriti primitivnu vrijednost u odgovarajuću klasu omota, na pr. an int do Cijeli broj ili a ugljen do Lik?

Pa, možemo koristiti konstruktor ili statičke tvorničke metode za pretvaranje primitivne vrijednosti u objekt klase omota.

Međutim, od Jave 9, konstruktori za mnoge upakirane primitive poput Cijeli broj ili Dugo su zastarjele.

Tako toplo se preporučuje koristiti tvorničke metode samo na novom kodu.

Pogledajmo primjer pretvaranja int vrijednost na an Cijeli broj objekt u Javi:

Integer objekt = novi Integer (1); Integer anotherObject = Integer.valueOf (1);

The vrijednost() metoda vraća instancu koja predstavlja navedeni int vrijednost.

Vraća predmemorirane vrijednosti što ga čini učinkovitim. Uvijek sprema vrijednosti između -128 i 127, ali može i predmemorirati i druge vrijednosti izvan ovog raspona.

Slično tome, možemo i pretvoriti boolean do Logički, bajt do Bajt, char do Karakter, dugačak do Dugo, plutaj do Plutati, i dvostruko do Dvostruko. Iako ako String moramo pretvoriti u Integer, trebamo ga koristiti parseInt () metoda jer Niz nije klasa omota.

S druge strane, za pretvorbu iz objekta omota u primitivnu vrijednost možemo koristiti odgovarajuću metodu kao što je intValue (), doubleValue ()itd:

int val = objekt.intValue (); 

Sveobuhvatnu referencu možete pronaći ovdje.

4. Autoboxing i Unboxing

U prethodnom smo odjeljku pokazali kako ručno pretvoriti primitivnu vrijednost u objekt.

Nakon Jave 5, ovo pretvaranje može se izvršiti automatski pomoću značajki koje se nazivaju autoboxing i unboxing.

"Boks" se odnosi na pretvaranje primitivne vrijednosti u odgovarajući objekt omota. Budući da se to može dogoditi automatski, poznato je kao autoboks.

Slično tome, kada se objekt omota razmota u primitivnu vrijednost, to je poznato kao raspakiranje.

To u praksi znači da možemo primitivnu vrijednost proslijediti metodi koja očekuje objekt omotaili dodijelite primitiv varijabli koja očekuje objekt:

Lista popisa = novi ArrayList (); list.add (1); // autoboxing Integer val = 2; // autoboks

U ovom primjeru Java će automatski pretvoriti primitiv int vrijednost omotu.

Interno koristi vrijednost() metoda za olakšavanje pretvorbe. Na primjer, sljedeći su retci ekvivalentni:

Cijela vrijednost = 3; Cijela vrijednost = Integer.valueOf (3);

Iako ovo pretvorbu čini jednostavnom, a kodove čitljivijim, postoje neki slučajevi u kojima ne bismo trebali koristiti autoboks, npr. unutar petlje.

Slično automatskom kutiranju, otpakiranje se vrši automatski prilikom prosljeđivanja objekta metodi koja očekuje primitiv ili pri dodjeli primitivnoj varijabli:

Integer objekt = novi Integer (1); int val1 = getSquareValue (objekt); // raspakiravanje int val2 = objekt; // otpakiranje javnog statičkog int getSquareValue (int i) {return i * i; }

U osnovi, ako napišemo metodu koja prihvaća primitivnu vrijednost ili objekt omota, i dalje im možemo proslijediti obje vrijednosti. Java će se pobrinuti za donošenje pravog tipa, npr. primitiv ili omot, ovisno o kontekstu.

5. Zaključak

U ovom smo brzom vodiču govorili o tečajevima omotača na Javi, kao i o mehanizmu automatskog i unboxinga.