2015-08-17 31 views
13

FindBugs mi sta dando un avvertimento circa la seguente riga, dove invoiceNumber è un oggetto Integer:valore Boxed unboxed poi nuova confezione

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

L'avvertimento è: "Valore Boxed è unboxed e poi subito nuova confezione"

Ora penso di capire (dis) la boxe, ma non riesco a vedere come faresti la stessa cosa senza ricevere l'avviso?

ho trovato che posso liberarmi di avvertimento utilizzando il seguente codice, invece, ma questo sembra più lunga-winded:

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

Qualcuno mi può mostrare qual è il modo 'corretto' per fare il sopra?

BTW, ho esaminato le domande correlate e ho capito cosa stava succedendo con loro, ma questo non sembra corrispondere a nessuno di questi.

+1

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

+0

Sì, questo elimina l'avviso, ma perché è "migliore". Sta costruendo un oggetto Integer (che dovrebbe essere costoso), ma non dovrebbe essere necessario. – DuncanKinnear

+1

Nel caso di 0 (o qualsiasi numero intero compreso tra -128 e 127), non sta costruendo alcuna nuova istanza di Integer, poiché l'istanza è già disponibile in IntegerCache. E stai salvando le operazioni di unboxing e boxing, quindi potrebbe darti un leggero miglioramento delle prestazioni. – Eran

risposta

21

Il tipo di espressione (invoiceNumber == null) ? 0 : invoiceNumber) è int. Richiede l'unboxing di invoiceNumber nel caso invoiceNumber non è null.

D'altra parte, String.format si aspetta un unico argomento String seguito da Object riferimenti, il che significa che il vostro int ottenere immediatamente inscatolato a Integer di nuovo.

Si può provare ad evitare l'unboxing originale usando (invoiceNumber == null) ? Integer.valueOf(0) : invoiceNumber), che renderebbe questa espressione restituire un Integer.

+0

Quindi vuol dire che la mia "soluzione" a 2 righe nella mia domanda è effettivamente meno efficiente, perché il "numero di fattura" è disgiunto da "invNo" e quindi reinserito su "Integer" per "String.format"? – DuncanKinnear

+1

@DuncanKinnear, esattamente! –

+8

@DuncanKinnear Suppongo che la "soluzione" a due righe impedisca a FindBugs di rilevare l'unboxing e il reboxing, quindi in realtà non cambia nulla rispetto al codice originale. – Eran

1

Provare a cambiare (invoiceNumber == null) ? 0 : invoiceNumber a (invoiceNumber == null) ? 0 : invoiceNumber.intValue(). Penso che l'avviso provenga da te usando il Integer di nuovo nel caso "falso", non uno int.

+0

No, stesso avvertimento. Ho provato a trasmettere il valore falso a '(int)' e ho ancora ricevuto l'avviso. – DuncanKinnear

+0

L'avviso quando sono via per me ... quale versione di Java stai usando? –

+0

Stiamo usando Java 1.6 – DuncanKinnear