Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Герберт Шилдт. Java 2, v5.0 (Tiger). Новые возм...doc
Скачиваний:
4
Добавлен:
01.03.2025
Размер:
1.21 Mб
Скачать

Основы автоупаковки/распаковки

Автоупаковка (autoboxing) — это процесс автоматической инкапсуляции данных простого типа, такого как int или double, в эквивалентную ему оболочку типа, как только понадобится объект этого типа. При этом нет необходимости в явном создании объекта нужного типа. Автораспаковка (auto-unboxing) — это процесс автоматического извлечения из упакованного объекта значения, когда оно потребуется. Вызовы методов, таких как intValue() и doubleValue(), становятся ненужными.

Добавление средств автоупаковки/автораспаковки значительно упрощает кодирование ряда алгоритмов, исключая утомительные упаковку и распаковку, выполняемые вручную. Кроме того, эти новые средства программирования позволяют избежать ошибок за счет устранения возможности распаковки вручную неверного типа из оболочки. Автоупаковка также облегчает использование настраиваемых типов (generics) и запоминание данных базовых типов в коллекциях.

Благодаря автоупаковке исчезает необходимость в создании вручную объекта для инкапсуляции значения простого типа. Вам нужно только присвоить это значение указателю на объект типа-оболочки. Язык Java автоматически создаст для вас этот объект. В следующей строке приведен пример современного способа конструирования объекта типа Integer, хранящего значение 100:

Integer iOb = 100; // автоматически упаковывает значение типа int

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

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

int i = iOb; // автораспаковка

Все детали выполнит для вас язык Java.

В листинге 2.1 приведена короткая программа, вобравшая в себя все приведенные ранее фрагменты и демонстрирующая основы механизма автоупаковки/распаковки,

Листинг 2.1. Демонстрация применения автоупаковки/распаковки

// Demonstrate autoboxing/unboxing.

class AutoBox {

public static void main(String args[]) {

Integer iOb = 100; ; // автоупаковка значения типа int

int i = iOb; // автораспаковка

System.out.println(i + " " + iOb); // отображает на экране: 100 100

}

}

Обратите внимание еще раз на то, что не нужно явно создавать объект типа Integer для упаковки значения 100 и нет необходимости вызывать метод intValue() для распаковки этого значения.

Автоупаковка и методы

Помимо простых случаев присваивания, автоупаковка выполняется автоматически каждый раз, когда данные базового типа должны быть преобразованы в объект, а автораспаковка — при необходимости преобразования объекта в значение базового типа. Следовательно, автоупаковка/распаковка может происходить, когда аргумент передается в метод или когда значение возвращается методом. Рассмотрим пример, приведенный в листинге 2.2.

Листинг 2.2. Автоупаковка/распаковка параметров метода и возвращаемых им значений

// Autoboxing/unboxing takes place with

// method parameters and return values.

class AutoBox2 {

// Принимает параметр типа Integer и возвращает

// значение типа int;

static int m(Integer v) {

return v ; // auto-unbox to int

}

public static void main(String args[]) {

// Передает значение int в метод m() и присваивает возвращаемое

// значение объекту типа Integer. Здесь аргумент 100

// автоупаковывается в объект типа Integer. Возвращаемое значение

// также автоупаковывается в тип Integer.

Integer iOb = m(100);

System.out.println(iOb);

}

}

Программа листинга 2.2 отображает следующий ожидаемый результат:

100

В приведенной программе метод задает параметр типа Integer и возвращает результат типа int. В теле main() методу m() передается значение 100. Поскольку ожидает объект типа Integer, передаваемое значение автоматически упаковывается. Далее метод то возвращает эквивалент своего аргумента, но простого типа int. Это приводит к автоматической распаковке в переменную v. Далее в методе main() объекту iOb присваивается это значение типа int, что вызывает его автоупаковку. Главное преимущество заключается в том, что все преобразования выполняются автоматически.