Autoboxing (immutables) - 1

— Привіт, Аміго!

Сьогодні я розповім про autoboxing. Box – це коробка. Boxing - упаковка. А AutoBoxing  – це відповідно – автоматична упаковка.

Наскільки ти пам'ятаєш, Java має як типи, успадковані від класу Object, так і примітивні типи. Але, як виявилося, така зручна річ як колекції та generic'и можуть працювати лише з типами, успадкованими від Object.

Тоді було прийнято рішення зробити не примітивний аналог кожного примітивного типу.

Примітивний тип Не-примітивний аналог
byte Byte
short Short
int Integer
long Long
float Float
double Double
boolean Boolean
char Карактор
void Void

Але щоразу перетворювати ці типи один на одного виявилося не дуже зручно:

int x = 3;
Integer y = New Integer(x+1);
int z = y.intValue();

Особливо, якщо працювати відразу з колекціями:

Приклад

int[] numbers = new int[10];
ArrayList<Integer> list = new ArrayList<>();
for (int i : numbers) {
    list.add(new Integer(i));
}

Тому розробники Java придумали автоматичне «упаковування» (boxing) і «розпаковування» (unboxing) примітивних типів у їхні непримітивні аналоги.

Ось як це працює:

Видимий код Що відбувається насправді
int x = 3;
Integer y=x+1;
int x = 3;
Integer y = Integer.valueOf(x+1);
int z = y;
int z = y.intValue();
Boolean b = Boolean.FALSE;
boolean a = b;
Boolean b = Boolean.FALSE;
boolean a = b.booleanValue();
Integer x = null;
int y = x;
Integer x = null; int y = x.intValue(); //кинеться виняток

Все просто. Ти можеш надавати типи int і Integer один одному, про інше подбає компілятор.

— Це дуже зручно.

— Ага. Але є нюанси, про які я розповім далі.