Автоупаковка


Начиная с JDK 5, к языку Java добавлены два важных средства: автоупаковка (autoboxing) и автораспаковка (autounboxing). Автоупаковка — это процесс, посредством которого примитивный тип автоматически инкапсулируется (упаковывается) в эквивалентную ему оболочку типа — всякий раз, когда требуется объект этого типа. Нет необходимости явного конструирования объекта. Автораспаковка — это процесс, с помощью которого значение упакованного объекта автоматически извлекается (распаковывается) из оболочки типа, когда нужно получить его значение. Нет необходимости вызывать методы вроде int Value () или doubleValue ().

Добавление автоматической упаковки и распаковки значительно упрощает кодирование некоторых алгоритмов, исключая необходимость в ручной упаковке и распаковке значений. Это также помогает предотвратить ошибки. Более того, это очень важно для средства обобщения классов и алгоритмов, которые оперируют только объектами. И, наконец, автоупаковка существенно облегчает работу с каркасом коллекций (Collection Framework), описанным во второй части книги.

С автоупаковкой больше нет необходимости в ручном конструировании объектов для оболочки примитивных типов. Вам нужно только присвоить значение ссылке оболочки типов. Java автоматически конструирует эти объекты для вас. Например, вот современный способ конструировать объект Integer, который содержит значение 100:

Integer iOb = 100; // автоупаковка int

Обратите внимание, что никакого объекта явно операцией new не создается. Java делает это для вас автоматически.

Чтобы распаковать объект, просто присваивайте ссылку на объект переменной примитивного типа. Например, чтобы распаковать iOb, вы должны использовать следующую строку:

int i = iOb; // автораспаковка Java справляется с деталями за вас.

Вот предыдущая программа, переписанная для использования автоупаковки/автораспаковки:

// Демонстрация автоупаковки/автораспаковки.
class AutoBox {
public static void main(String args[]) {
Integer iOb = 100; // автоупаковка int
int i = iOb; // автораспаковка
System.out.println (i + " " + iOb); // отображает 100 100
}
}