Автобоксирование, похоже, сводится к тому, что я могу написать:
Integer i = 0;
вместо:
Integer i = new Integer(0);
Таким образом, компилятор может автоматически преобразовать примитив в объект.
Это идея? Почему это важно?
Автобоксирование, похоже, сводится к тому, что я могу написать:
Integer i = 0;
вместо:
Integer i = new Integer(0);
Таким образом, компилятор может автоматически преобразовать примитив в объект.
Это идея? Почему это важно?
Вы немного упростили это.
Автобоксинг также входит в игру при использовании коллекций. Как объясняется в sun java docs:
Коллекции могут содержать только ссылки на объекты, поэтому вам нужно вставить примитивные значения в соответствующий класс-оболочку. ... Когда вы вынимаете объект из коллекции, вы получаете Integer, который вы вставляете; если вам нужен int, вы должны распаковать Integer, используя метод intValue. Весь этот бокс и unboxing - это боль и загромождает ваш код. Функция автобоксинга и распаковки автоматизирует процесс, устраняя боль и беспорядок.
Итак, когда вы должны использовать autoboxing и unboxing? Используйте их только при наличии "несоответствия импеданса" между ссылочными типами и примитивами, например, когда вам нужно ввести числовые значения в коллекцию. Нецелесообразно использовать автобоксинг и распаковку для научных вычислений или другой высокопроизводительный численный код. Целое число не является заменой int; autoboxing и unboxing размывают различие между примитивными типами и ссылочными типами, но они не устраняют его.
Кстати
Integer i = 0;
эквивалентно
Integer i = Integer.valueOf(0);
Различие заключается в том, что valueOf() не создает новый объект для значений между -128 и 127 (по-видимому, это будет настраиваться, если Java 6u14)
Он существует, чтобы вы могли писать код типа
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()), но как долго он равен int (используя ==).
Это идея, да. Тем не менее, еще удобнее назначить Integer для int.
Можно утверждать, что autoboxing рассматривает симптом, а не причину. Существенным источником путаницы является то, что система типов Java непоследовательна: необходимость как примитивов, так и ссылок на объекты является искусственной и неудобной. Автобоксинг несколько смягчает это.
Делает более читаемый и более чистый код. Особенно, если вы выполняете операции (поскольку Java не имеет перегрузки оператора).
С моей циничной шляпой: для подбора ограничений на оригинальную Java (я имею в виду Oak здесь) spec. Не только в первый раз.
Из того, что я помню, когда читал Joshua Bloch Effective Java, вы должны рассмотреть примитивы над своими коробочными коллегами. Автобоксирование без учета его побочных эффектов может вызвать проблемы.
Добавляя в комментарий Lim, примитивы хранятся в стеке, а примитивные обертки, как объекты, хранятся в куче... Из-за этого возникают незначительные последствия.
Основным преимуществом было бы читаемость, синтаксический сахар в основном. Java уже очень многословна, Sun пытается использовать всевозможные способы сокращения синтаксиса.