Автобокс: Итак, я могу написать: Integer i = 0; вместо: Integer i = new Integer (0); - PullRequest
10 голосов
/ 20 апреля 2009

Автобокс, похоже, сводится к тому, что я могу написать:

Integer i = 0; 

вместо:

Integer i = new Integer(0);

Таким образом, компилятор может автоматически преобразовывать примитив в объект.

Это идея? Почему это важно?

Ответы [ 9 ]

16 голосов
/ 20 апреля 2009

Вы немного упростили это.

Автобокс также вступает в игру при использовании коллекций. Как объясняется в Java-документах Sun:

Коллекции могут содержать только ссылки на объекты, поэтому вы должны поместить значения примитивов в соответствующий класс-оболочку. ... Когда вы вынимаете объект из коллекции, вы получаете целое число, которое вы вставили; если вам нужно int, вы должны распаковать Integer, используя метод intValue. Весь этот бокс и распаковка является болью и загромождает ваш код. Функция автобоксирования и распаковки автоматизирует процесс, устраняя боль и беспорядок.

Так, когда вы должны использовать autoboxing и unboxing? Используйте их только тогда, когда существует «несоответствие импеданса» между ссылочными типами и примитивами, например, когда вам нужно поместить числовые значения в коллекцию. Не рекомендуется использовать автобокс и распаковку для научных вычислений или другой чувствительный к производительности числовой код. Integer не является заменой для int; Автобокс и распаковка стирают различие между примитивными типами и ссылочными типами, но они не устраняют это.

Отличный обзор автобокса

8 голосов
/ 20 апреля 2009

КСТАТИ

Integer i = 0;

эквивалентно

Integer i = Integer.valueOf(0);

Различие состоит в том, что valueOf () не создает новый объект для значений между -128 и 127 (очевидно, это будет настраиваться, если Java 6u14)

5 голосов
/ 20 апреля 2009

Он существует для того, чтобы вы могли написать код вроде

List<Integer> is = new ArrayList<Integer>();
is.add(1); // auto-boxing
is.add(2);
is.add(3);

int sum = 0;
for (int i : is)  // auto-unboxing
{
    sum += i;
}

Для отдельных целых чисел по умолчанию следует использовать тип int, а не Integer. Целое число в основном для использования в коллекциях.

Помните, что Long отличается от того же значения, что и Integer (используя equals ()), но как long он равен int (используя ==).

3 голосов
/ 20 апреля 2009

Это идея, да. Тем не менее, еще удобнее иметь возможность присваивать целое число целому.

Можно утверждать, что автобокс направлен скорее на симптом, чем на причину. Истинный источник путаницы заключается в том, что система типов Java противоречива: потребность в примитивах и ссылках на объекты является искусственной и неудобной. Автобокс несколько смягчает это.

2 голосов
/ 20 апреля 2009

С моей циничной шляпой: чтобы исправить ограничения на оригинальную спецификацию Java (я имею в виду Oak здесь). Не только в первый раз.

1 голос
/ 20 апреля 2009

Основным преимуществом будет удобочитаемость, синтаксический сахар в принципе. Java уже очень многословна, Sun пытается всеми способами сократить синтаксис.

1 голос
/ 20 апреля 2009

В дополнение к комментарию Лим, примитивы хранятся в стеке, а примитивы-обертки, как объекты, хранятся в куче ... Из-за этого есть тонкие последствия.

1 голос
/ 20 апреля 2009

Из того, что я помню из чтения «Эффективной Java» Джошуа Блоха, вы должны рассмотреть примитивы над их коробочными аналогами. Автобокс без учета его побочных эффектов может вызвать проблемы.

1 голос
/ 20 апреля 2009

Делает для более читабельного и аккуратного кода. Особенно, если вы выполняете операции (поскольку в Java нет перегрузки операторов).

...