2015-08-17 15 views
13

FindBugs mir eine Warnung über die folgende Zeile geben, wo invoiceNumber ist ein Integer Objekt:Boxed Wert unboxed Umgepackte dann

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

Die Warnung wird: „Boxed Wert wird unboxed und dann sofort Umgepackte“

Jetzt denke ich, ich verstehe (un) Boxen, aber ich kann nicht sehen, wie Sie das gleiche tun würden, ohne die Warnung zu bekommen?

Ich habe festgestellt, dass ich die Warnung loswerden stattdessen den folgenden Code verwenden, aber dies scheint mehr langatmig:

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

Kann mir jemand zeigen, was das ist ‚richtige‘ Art und Weise das zu tun über?

BTW, ich habe mir die verwandten Fragen angeschaut und ich verstehe, was mit ihnen los ist, aber das scheint nicht zu denen von denen zu passen.

+1

Vielleicht 'text.append (String.format ("% 010d- ", (invoiceNumber == null)? Ineger.valueOf (0): invoiceNumber));' wird tun. – Eran

+0

Ja, das wird die Warnung los, aber warum ist das "besser". Es baut ein Integer-Objekt (was teuer sein sollte), sollte es aber nicht müssen. – DuncanKinnear

+1

Bei 0 (oder einer Ganzzahl von -128 bis 127) wird keine neue Integer-Instanz konstruiert, da die Instanz bereits in IntegerCache verfügbar ist. Und Sie speichern die Unboxing- und Boxing-Vorgänge, sodass Sie möglicherweise eine leichte Leistungsverbesserung erzielen. – Eran

Antwort

21

Der Typ des Ausdrucks (invoiceNumber == null) ? 0 : invoiceNumber) ist int. Es erfordert Unboxing von invoiceNumber in dem Fall invoiceNumber ist nicht null.

Auf der anderen Seite, String.format erwartet ein einziges String durch Object Referenzen gefolgt Argument, das Ihre int bedeutet sofort Integer wieder verpackt bekommen.

Sie können versuchen, das ursprüngliche Unboxing zu vermeiden, indem Sie (invoiceNumber == null) ? Integer.valueOf(0) : invoiceNumber) verwenden, wodurch dieser Ausdruck eine Integer zurückgeben würde.

+0

Also bedeutet das, dass meine 2 Zeilen "Lösung" in meiner Frage tatsächlich weniger effizient ist, weil die 'rechnungsnummer' zu' invNo' entpackt und dann zu'Integer' für das 'String.format' reboxed wird? – DuncanKinnear

+1

@Duncankinnear, genau! –

+8

@DuncanKinnear Ich gehe davon aus, dass Ihre zwei Zeilen "Lösung" nur verhindert, dass FindBugs das Unboxing und das Reboxen erkennt, so dass es nichts im Vergleich zu Ihrem ursprünglichen Code ändert. – Eran

1

Versuchen Sie, (invoiceNumber == null) ? 0 : invoiceNumber zu (invoiceNumber == null) ? 0 : invoiceNumber.intValue() zu ändern. Ich denke, die Warnung kommt von Ihnen mit der Integer wieder im "false" -Fall, nicht ein int.

+0

Nein, die gleiche Warnung. Ich habe versucht, den falschen Wert auf "(int)" zu setzen und habe immer noch die Warnung erhalten. – DuncanKinnear

+0

Die Warnung, wenn weg für mich ... welche Version von Java verwenden Sie? –

+0

Wir verwenden Java 1.6 – DuncanKinnear