2015-08-17 6 views
13

FindBugs дает мне предупреждение о следующей строке, где invoiceNumber является Integer объектом:штучного значения распакованного затем reboxed

text.append(String.format("%010d-", (invoiceNumber == null) ? 0 : invoiceNumber)); 

Предупреждения: «штучное значение распакованное, а затем сразу же reboxed»

Теперь я думаю, что понимаю (не) бокс, но я не вижу, как вы будете делать то же самое, не получая предупреждение?

Я обнаружил, что я могу избавиться от предупреждения, используя следующий код вместо этого, но это, кажется, более многословно:

int invNo = (invoiceNumber == null) ? 0 : invoiceNumber; 
text.append(String.format("%010d-", invNo)); 

Может кто-то показать мне, что такое «правильный» способ сделать выше?

BTW, я рассмотрел связанные вопросы, и я понимаю, что с ними происходит, но это, похоже, не соответствует ни одному из них.

+1

Возможно, 'text.append (String.format ("% 010d- ", (invoiceNumber == null)? Ineger.valueOf (0): invoiceNumber));' будет делать. – Eran

+0

Да, это избавляет от предупреждения, но почему это «лучше». Он создает объект Integer (который должен быть дорогим), но ему не нужно. – DuncanKinnear

+1

В случае 0 (или любого целого числа от -128 до 127) он не создает какой-либо новый экземпляр Integer, так как экземпляр уже доступен в IntegerCache. И вы сохраняете операции распаковки и бокса, так что это может дать вам небольшое улучшение производительности. – Eran

ответ

21

Тип выражения (invoiceNumber == null) ? 0 : invoiceNumber): int. Он требует распаковки invoiceNumber в случае invoiceNumber не null.

С другой стороны, String.format ожидает один аргумент String следуют Object ссылки, а это значит, ваш int получить немедленно снова боксировал в Integer.

Вы можете попытаться избежать первоначального распаковки с помощью (invoiceNumber == null) ? Integer.valueOf(0) : invoiceNumber), что сделало бы это выражение возвратом Integer.

+0

Значит ли это, что мое 2-строчное «решение» в моем вопросе фактически менее эффективно, потому что 'invoiceNumber' распакован для' invNo', а затем переустановлен в 'Integer' для' String.format'? – DuncanKinnear

+1

@ DuncanKinnear, точно! –

+8

@ DuncanKinnear Я предполагаю, что ваше двухстрочное «решение» только мешает FindBugs обнаруживать unboxing и reboxing, так что это фактически ничего не меняет по сравнению с вашим исходным кодом. – Eran

1

Попробуйте изменить (invoiceNumber == null) ? 0 : invoiceNumber на (invoiceNumber == null) ? 0 : invoiceNumber.intValue(). Я думаю, что предупреждение приходит от вас, используя Integer снова в «ложном» случае, а не int.

+0

Нет, то же предупреждение. Я попытался сделать ложное значение '(int)', и я получил предупреждение. – DuncanKinnear

+0

Предупреждение, когда я уезжаю за мной ... какую версию Java вы используете? –

+0

Мы используем Java 1.6 – DuncanKinnear