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 Character
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 друг-другу, об остальном позаботится компилятор.

— Это очень удобно.

— Ага. Но есть нюансы, о которых я расскажу дальше.