Проблема с Findbugs с "Бокс/распаковка для анализа примитива" с Integer.valueOf(String)

У меня есть эта часть кода:

public void someMethod(String id) {
   someOtherMethod(Integer.valueOf(id));
}

public void someOtherMethod(int id) {
   // do something with id
}

И на этой второй строке Findbugs выбрасывает это исключение:

Бокс/распаковка для анализа примитива

Почему Findbugs жалуется на это, когда я просто вызываю Integer.valueOf()/как я могу это исправить?

Ответы

Ответ 1

Проблема заключается в том, что Integer.valueOf возвращает Integer, а не int, но ваш someOtherMethod ожидает int. Findbugs в основном предупреждает вас, что вы делаете это длинным способом, который связан с потенциальным созданием объекта (Integer), который вам не нужен, который вы сразу же отправляете в unbox, передав его someOtherMethod(int), например:

String => int => Integer => int
          ^^^^^^^^^^^^^^
                \--- This is inside Integer.valueOf

Вместо этого вы можете и, вероятно, должны избегать этого ненужного раунда через Integer и просто выполните:

String => int
^^^^^^^^^^^^^
      \--- Integer.parseInt

Нет необходимости в временном Integer и потенциальном распределении памяти и таком окружении.

Если someOtherMethod ожидали Integer, вы не получили бы предупреждения, потому что Integer не является чисто временным.

Это всего лишь один из классов ненужных бокс-конверсий, которые Findbugs и инструменты, как это, полезно отметить.

Ответ 2

Мне потребовалось некоторое время, чтобы понять, что один из них (частично потому, что Дженкинс просто сказал "Бокс/распаковка для разбора примитива" ), но, видимо, проблема/решение заключается в том, что Integer.valueOf() делает внутренне, а именно:

Integer.valueOf(parseInt(s, 10));

Итак, решение состоит в том, чтобы просто вызвать parseInt() непосредственно:

someOtherMethod(Integer.parseInt(id));

Подробное описание проблемы (DM_BOXED_PRIMITIVE_FOR_PARSING) можно найти на странице findbugs.