2009-04-20 2 views
10

Autoboxing, кажется, сводится к тому, что я могу написать:Autoboxing: Итак, я могу написать: Integer i = 0; вместо: Integer i = new Integer (0);

Integer i = 0; 

вместо:

Integer i = new Integer(0); 

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

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

ответ

16

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

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

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

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

Great overview of Autoboxing

1

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

1

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

+1

Какие ограничения? –

+4

С чего начать? API-интерфейс Time-Date, отсутствие API-интерфейсов коллекций с самого начала, массивы, являющиеся «легкими» объектами, а не переопределение Object.equals(), отсутствие Generics с самого начала, «странный» механизм клонирования ... В конечном итоге вы найти тонкие скрипы на языке, прочитать их и как они были исправлены. В конце дня Java стал возрожденным встроенным языком для бума dot-com, и он показывает. Я предпочитаю C#, несмотря на то, что Microsoft. –

3

Это идея, да. Однако еще удобнее назначить Integer для int.

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

+0

Что неудобно в отношении примитивов? Вы имеете в виду, что это умаляет чисто объектно-ориентированный характер языка? В Ruby, например, целые числа являются объектами. Это то, что вы имели ввиду? –

+0

Я действительно не понимаю, почему это такое большое дело. Я думаю, что они должны были оставить достаточно одного. Это, похоже, не добавляет многого, из того, что я могу сказать до сих пор. Конечно, я только что узнал об этой функции около пяти минут назад. –

+0

Да, вот что я имею в виду. Я не пурист OO на любом участке, но не очевидно, почему программисту выгодно иметь как int, так и Integer в их распоряжении. Я думаю, что одной абстракции должно быть достаточно, чтобы охватить «целочисленность». – jcrossley3

1

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

+0

Что это значит? –

+0

Поскольку примитивы всегда копируются, когда они передаются. Я не верю, что это верно в отношении их боксеров. – CookieOfFortune

1

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

1

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

7

BTW

Integer i = 0; 

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

Integer i = Integer.valueOf(0); 

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

+0

Спасибо! Было очень смутно, почему только иногда создавался новый объект! – DustByte

+0

@DustByte, потому что он может кэшировать только общие объекты. Кэширование каждого Integer будет использовать 40 ГБ памяти (только для целых) –

5

Он существует, так что вы можете написать код, как

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 отличается от того же значения, что и целое число (с использованием equals()), но как long оно равно int (используя ==).

Смежные вопросы