Значение Integer.valueOf () - PullRequest
3 голосов
/ 06 июля 2010

Есть ли причина использовать Integer.valueOf (X) для инициализации окончательного Integer, как показано ниже:

public class MyClass
{
  public static final Integer DAY_1 = Integer.valueOf(1); // Why do it this way?
  public static final Integer DAY_2 = 2; // When it can be done this way?
}

Я понимаю, что это было необходимо в более старых версиях Java до добавления автобоксирования.Есть ли какая-либо причина для такого типа кода?Или это просто вредная привычка?

Ответы [ 7 ]

8 голосов
/ 06 июля 2010
  • Перед выходом 1.5 написано много кода. Нет необходимости обновлять все это, не принося никакой пользы.
  • В некоторых случаях становится понятнее, что вы являетесь боксом. В приведенном вами случае вы можете легко увидеть тип цели в одной строке, но это не всегда так.
  • Если вы хотите вызвать метод с перегрузками для Integer и int и хотите вызвать перегрузку Integer, это простой способ сделать это.
4 голосов
/ 06 июля 2010

В дополнение к причинам Джона, некоторые люди просто не любят автоматический (не) бокс, точка. Есть много нюансов, которые некоторые люди категорически избегают, вообще запрещая их использование из-за необязательных ошибок или предупреждений компиляции (Eclipse может превратить их в ошибки или предупреждения, например)

Если это так, у вас нет большого выбора, кроме как использовать первое, даже в таких случаях, когда это не очень много.

4 голосов
/ 06 июля 2010

Программист может написать это таким образом, чтобы визуально подчеркнуть, что DAY_1 - это целое число (объект), а не целое число.

Я не говорю, что рекомендую это, но я мог бы представить кого-топринимая этот подход по этой причине.

1 голос
/ 10 января 2012

Integer.valueOf (1) позволяет кэшировать общие значения;для значений от -128 до 128 он всегда будет возвращать один и тот же объект, например, тогда как new Integer (1) всегда будет возвращать новый объект.Я бы сказал, что это хорошая практика - использовать это для всех производных от Number типов (Integer, Long, BigDecimal и т. Д.), Хотя это, вероятно, в любом случае делает автобокс под прикрытием.

Барт ван Хейкелом,разница между list.remove (1) и list.remove (new Integer (1)) заключается в следующем;list.remove (1) удалит объект с индексом 1 из списка, list.remove (new Integer (1)) удалит все объекты в списке, которые равны объекту Integer со значением один.Помните, что Коллекции не могут хранить примитивы, только объекты.

1 голос
/ 06 июля 2010

Автобокс может привести к очень тонким ошибкам, которые могут быть очень трудно найти.Из-за этого некоторые IDE могут генерировать предупреждение при использовании любого вида упаковки / распаковки.Если вы хотите заставить замолчать это предупреждение, вариант 1 сделает это за вас.

Итак, в конце концов, все сводится к личным предпочтениям и стандартам кодирования проекта.

В данном конкретном случаенет опасности использовать автобокс.

1 голос
/ 06 июля 2010

Что касается компилятора, то нет никакой разницы (хотя следует соблюдать осторожность в случае перегруженных аргументов).Под капотом форма, показанная для DAY_2, просто преобразуется в форму, используемую для DAY_1 компилятором.

Для людей может существовать разница.Я обычно избегаю автоматического (не) бокса как акта защитного программирования, потому что я чувствую, что практика делает слишком легким для меня забыть нулевой случай.Но на самом деле, решать только вам.

0 голосов
/ 06 июля 2010

Это плохая привычка, и нет причин делать это, так как компиляция сгенерирует для вас Integer.valueOf().

...