Введение

Концепция языка программирования

В информатике, боксинг (также известный как упаковка) — это преобразование, заключающееся в размещении примитивного типа внутри объекта, чтобы значение можно было использовать как ссылку. Анбоксинг — это обратное преобразование, извлечение примитивного значения из его объекта-обертки. Автобоксинг — это термин, обозначающий автоматическое применение преобразований боксинга и/или анбоксинга по мере необходимости.

Боксер

Наиболее заметное применение боксинга наблюдается в Java, где существует различие между типами-ссылками и типами-значениями, обусловленное такими факторами, как эффективность выполнения, а также синтаксические и семантические особенности. В Java список может хранить только значения определенного типа, но хотелось бы иметь возможность хранить значения примитивных типов в списке. Вместо этого Java определяет классы-обертки для каждого примитивного типа: `Integer` и `Boolean`, `Float` и `Double`, `Long` и т.д. Тогда можно определить список, используя обобщенный тип-обертку, и вставлять примитивные значения в список, преобразуя их в объекты-обертки (боксинг). (Используя обобщенные параметризованные типы, представленные в J2SE 5.0, этот тип представляется как `List<Integer>`.) С другой стороны, в C# нет классов-оберток для примитивных типов, но допускается боксинг любого типа-значения, возвращающий универсальную ссылку. В Objective-C любое примитивное значение можно снабдить префиксом `*`, чтобы преобразовать его в указатель (например, `*int` или `*float`). Это позволяет добавлять их в любые стандартные коллекции, такие как `NSArray`.

В Haskell практически отсутствует понятие типа-ссылки, но термин "boxed" все равно используется для обозначения единообразного указателя системы времени выполнения на представление в виде объединения с тегами. Объект в формате boxing всегда является копией объекта-значения и обычно является неизменяемым. Операция unboxing (распаковка) также возвращает копию хранимого значения. Многократное выполнение операций боксинга и unboxing может существенно снизить производительность, поскольку боксинг динамически выделяет новые объекты, а unboxing (если объект-обертка больше не используется) делает их доступными для сборки мусора. Однако современные сборщики мусора, такие как сборщик мусора Java HotSpot по умолчанию, могут более эффективно собирать объекты с коротким временем жизни, поэтому, если объекты-обертки живут недолго, влияние на производительность может быть незначительным. В некоторых языках существует прямое соответствие между распакованным примитивным типом и ссылкой на неизменяемый объект-обертку. Фактически, можно заменить все примитивные типы в программе на объекты-обертки. В то время как присваивание от одного примитивного типа к другому копирует его значение, присваивание от одной ссылки на объект-обертку к другой копирует значение ссылки, чтобы она указывала на тот же объект, что и первая ссылка. Однако это не вызовет проблем, поскольку объекты неизменяемы, поэтому семантически нет реальной разницы между двумя ссылками на один и тот же объект или на разные объекты (если не рассматривать физическое равенство). Для всех операций, кроме присваивания, таких как арифметические, сравнения и логические операции, можно выполнить unboxing объекта-обертки, выполнить операцию и, при необходимости, снова выполнить боксинг результата. Таким образом, можно вообще не хранить примитивные типы.