boxing و Unboxing

در زبان برنامه نویسی جاوا، 8 نوع داده اصلی وجود دارد که هر کدام از آنها دارای یک کتابخانه کلاس (library class) از نوع مرجع، مربوط به خود هستند. به عنوان مثال کلاس java.lang.Integer کتابخانه مربوط به نوع اصلی int می باشد. این نوع کلاس ها را wrapper class یا کلاس های پوششی می نامند. این نوع کلاس ها غیر قابل تغییر بوده، و وقتی ایجاد می شوند نمی توان مقدار آنها را عوض کرد. همچنین چون از نوع final هستند، در نتیجه نمی توانند دارای زیر کلاس هم باشند. در جدول زیر انواع اصلی و کلاس های Wrapper مربوط به آنها آمده است :

نوع مرجع نوع اصلی
Byte byte
Short short
Integer int
Long long
Float float
Double double
Boolean boolean
Character char

قبل از Java SE 5 برای مقدار دهی به یک متغییر از نوع Integer باید حتما یک شئ از کلاس Integer ایجاد می کردیم و همچنین برای مقدار دهی به یک متغییر از نوع int با استفاده از یک شئ Integer باید حتما از متد intValue کلاس Integer استفاده می کردیم، اما بعد از Java SE 5 و با افزوده شدن قابلیت Boxing و Unboxing این مشکل برطرف و به طور خودکار این تبدیل ها انجام شد.

Boxing فرایندی است که طی آن یک نوع اصلی مانند int به یک نوع مرجع مانند Integer تبدیل می شود. Unboxing برعکس، عمل تبدیل یک نوع مرجع به یک نوع مقداری می باشد. کد زیر فرایند boxing را نشان می دهد :

int i = 100;

Integer number = i; 

در پس زمینه، کامپایلر کد بالا را به صورت زیر به نوع مرجع تبدیل می کند :

 Integer number = Integer.valueOf(i);

در فرایند boxing نوع مقداری به سادگی با یک متغیر از نوع مرجع برابر قرار داده می شود. در زیر نحوه تبدیل یک نوع مرجع به نوع مقداری به وسیله unboxing نشان داده شده است.

Integer number = 100;

int i = number;

در پس زمینه، کامپایلر کد بالا را به صورت زیر به نوع اصلی تبدیل می کند :

Integer number= Integer.valueOf(12);

int i = number.intValue();