Вложенное значение распаковано, а затем переустановлено
FindBugs дает мне предупреждение о следующей строке, где invoiceNumber
- объект Integer
:
text.append(String.format("%010d-", (invoiceNumber == null) ? 0 : invoiceNumber));
Предупреждение: "Вложенное значение распаковано, а затем немедленно переустановлено"
Теперь я думаю, что понимаю (не) бокс, но я не вижу, как бы вы сделали то же самое, не получив предупреждения?
Я обнаружил, что вместо этого могу избавиться от предупреждения, используя следующий код, но это кажется более длинным:
int invNo = (invoiceNumber == null) ? 0 : invoiceNumber;
text.append(String.format("%010d-", invNo));
Может кто-нибудь показать мне, что такое "правильный" способ сделать выше?
Кстати, я просмотрел связанные вопросы, и я понимаю, что с ними происходит, но это, похоже, не соответствует ни одному из них.
Ответы
Ответ 1
Тип выражения (invoiceNumber == null) ? 0 : invoiceNumber)
int
. Он требует распаковки invoiceNumber
в случае invoiceNumber
не null
.
С другой стороны, String.format
ожидает один аргумент String
, за которым следуют ссылки Object
, что означает, что ваш int
снова будет удален в поле Integer
.
Вы можете попытаться избежать первоначального распаковки с помощью (invoiceNumber == null) ? Integer.valueOf(0) : invoiceNumber)
, который заставит это выражение возвращать Integer
.
Ответ 2
Попробуйте изменить (invoiceNumber == null) ? 0 : invoiceNumber
на (invoiceNumber == null) ? 0 : invoiceNumber.intValue()
. Я думаю, что предупреждение приходит от вас, используя Integer
снова в "ложном" случае, а не int
.