Avtoupakovka și despachetarea în Java.
În acest articol, vom lua în considerare o astfel de facilitate în Java ca avtoupakovka / despachetarea.
Avtoupakovka și despachetare este o funcție de conversie de tipuri primitive în și vice-versa obiect.
Întregul proces este realizat mediu de rulare Java automat (JRE). Dar ar trebui să fie atent cu această funcție, deoarece Ea poate afecta performanța programului.
În versiunile mai mici decât JDK 1.5 nu a fost ușor pentru a converti tipurile de date primitive, cum ar fi
int, char, float, dublu clasele lor Integer coajă, caracter, Float, Double. Incepand cu JDK versiunea 5 această funcție, conversia primitivelor la obiecte echivalente, se realizează în mod automat.
Această proprietate este cunoscut sub numele de Avtoupakovka (Autoboxing). Procesul invers, respectiv - Unpacking (Unboxing) adică procesul de conversie a obiectelor în tipurile lor primitive corespunzătoare.
Exemplu de cod pentru avtoupakovki și decomprimare sunt prezentate mai jos:
Atunci când este utilizat avtoupakovka și despachetarea?
compilator Avtoupakovka Java este utilizat în următoarele condiții:
Atunci când o valoare de tip primitiv este trecut în metoda ca metodă de setare, care se așteaptă ca obiectul care corespunde clasei înveliș.
Atunci când o valoare de tip primitiv atribuit variabilei corespunzătoare clasei înveliș.
Luați în considerare următorul exemplu:
Listarea 1: Un cod simplu care arată avtoupakovku
Versiunile anterioare ale jdk 1.5 codul de mai sus ar cauza o eroare de compilare, deoarece operatorul rest% și plus unar + = nu poate fi aplicat la clasa înveliș.
Dar, în JDK 1.5 și de mai sus, acest cod compilează fără erori, de conversie Integer int.
Despachetarea compilatorul Java este utilizat în următoarele condiții:
Când un obiect este transmis ca parametru al metodei, care se așteaptă ca tipul primitiv corespunzător.
Atunci când obiectul atribuit tipului primitiv respectiv.
Luați în considerare următorul exemplu:
Listarea 2: Un cod simplu care arată despachetarea
Avtoupakovka și unboxing permite dezvoltator pentru a scrie cod care este ușor de citit și de înțeles. Tabelul de mai jos prezintă tipurile de date primitive și obiectele lor coajă corespunzătoare.
Tabelul 1: Tipuri primitive și clase wrapper echivalente
De la operatori de comparare
Avtoupakovka și decompresie pot fi utilizate cu operatorii de comparație. Următorul fragment de cod ilustrează modul în care funcționează:
Listarea 3: Exemplu de cod care arată avtoupakovku și despachetarea unui operator de comparare
Avtoupakovka și despachetarea, dacă metoda este supraîncărcat
Avtoupakovka și decomprimare se efectuează la o supraîncărcare a metodei în conformitate cu următoarele reguli:
- Extinderea ambalajelor „victorii“ - într-o situație în care devine o alegere între expansiune și extindere de ambalare preferat.
Listarea 4: Exemplu de cod care prezintă avantajul de supraîncărcare
Concluzia programului - un int
- Extinderea de a câștiga un număr variabil de argumente - Într-o situație în care devine o alegere între o extensie și un număr variabil de argumente, o extensie este de preferat.
Listarea 5: Exemplu de cod care prezintă avantajul unei suprasarcini
- ambalare câștigă un număr variabil de argumente - Într-o situație în care devine o alegere între ambalaj și un număr variabil de argumente, ambalajul este de preferat.
Listarea 6: Exemplu de cod care prezintă avantajul de supraîncărcare
Ar trebui să ne amintim următoarele lucruri folosind Avtoupakovku:
După cum știm, orice caracteristică bun are un defect. Avtoupakovka nu este o excepție în acest sens. Unele note importante pe care dezvoltatorul ar trebui să ia în considerare atunci când se utilizează această funcție:
- Compararea obiectelor operatorului „==“ poate duce la confuzie, deoarece poate fi aplicat la tipuri și obiecte primitive. Atunci când acest operator se aplică obiectelor, se compară de fapt referințele obiect, mai degrabă decât ei înșiși obiectele.
Listarea 7: Exemplu de cod care arată comparația.
- obiecte de amestecare și tipuri primitive, cu egalitatea și operatori relaționale. Dacă vom compara tipul primitiv al obiectului, atunci există despachetarea obiect care poate arunca NullPointerException dacă un obiect nul.
- Obiect Caching. valueOf () metodă creează un container de obiecte primitive, care-l cache-uri. Deoarece valorile sunt memorate în cache în intervalul de -128-127, inclusiv, aceste obiecte stocate în memoria cache se pot comporta diferit.
- Deteriorarea performanței. Avtoupakovka sau despachetarea performanței aplicației degrade, deoarece creează un obiect nedorit, din cauza care colectorul de gunoi pentru a lucra mai des.
Dezavantaje Avtoupakovki.
Deși Avtoupakovka are o serie de avantaje, are următoarele dezavantaje:
Listarea 8: Exemplu de cod care arată problema de performanță.
Această porțiune de cod, suma + = i va fi extins la suma = suma + i. Deoarece operatorul „+“ JVM începe decompresie, deoarece operatorul „+“ nu poate fi aplicată obiectului Integer. Și apoi rezultatul avtoupakovyvaetsya înapoi.
Versiunile anterioare ale JDK 1.5 tipuri de date int și Integer diferite. In cazul unei suprasarcini a metodei, aceste două tipuri au fost utilizate fără nici o problemă. Odată cu apariția de ambalare automate / despachetare, a devenit mai dificilă.
Un exemplu este supraîncărcată elimina () metoda ArrayList. Clasa de ArrayList are două metode de îndepărtare - eliminare (index) și îndepărtați (obiect). În acest caz, suprasolicitării metoda nu se produce și o metodă corespunzătoare va fi numit cu parametrii corespunzători.
Concluzie.
Avtoupakovka este un mecanism de conversie a latente tipurile de date primitive la clasele wrapper corespunzătoare (obiecte). Compilatorul foloseste valueOf () pentru a converti tipurile primitive la obiecte și metode intValue) metoda (un doubleValue (), etc. pentru a obține tipuri de obiecte primitive. Avtoupakovka convertește boolean boolean la boolean, octet în Byte, char Caracter, pluti într-un flotor, int la Integer, mult timp în lung, scurt pe scurt. Dezambalare are loc în direcția opusă.
articolul original