2014-04-27 10 views
6

Sono non che cerca di disattivare o ignorare l'avviso come in The expression of type x is boxed into X?.Qual è il modo appropriato di gestire l'avviso: "L'espressione di tipo x è racchiusa in x"

Mi piacerebbe sapere qual è il modo corretto di gestire/evitare questo avviso è se uno era così inclinato.

+0

Sono tendenzialmente d'accordo con Jeffrey su "disattivare l'avviso". Eclipse elenca questo avviso in "Potenziali problemi di programmazione", in base al link che hai incluso; ma non lo vedo come una fonte di problemi. – ajb

risposta

8

Le operazioni di boxing e unboxing sono operazioni effettuate dall'utente possono fare a mano, ma sono costruite nella lingua per evitare la ripetizione che incontrerete senza dubbio.

Integer obj = Integer.valueOf(5); // instead of Integer obj = 5; 
int i = obj.intValue(); // instead of int i = obj; 

A mio parere, il modo appropriato per gestire tale avviso per disattivarlo. Ma se questa non è un'opzione, puoi fare quanto sopra.

+1

L'unboxing manuale presenta tuttavia un vantaggio: il dereferenziazione esplicita di un puntatore potenzialmente nullo. – KeatsPeeks

+0

@ Keats Non è un gran vantaggio. Ad ogni modo, se 'obj' era' null', otterrai un 'NullPointerException'. Immagino che in questo caso sia un po 'più ovvio da dove proviene. – Jeffrey

+1

@Jeffery Quello che voglio dire è che con l'unboxing automatico, potresti dimenticarti del possibile NPE, mentre farlo manualmente ti costringe a pensare a questo proposito. Questo è lo scopo dell'avviso OP: ti costringi ancora a pensare all'NPE anche se stai utilizzando l'unboxing automatico. – KeatsPeeks

3

A mio parere è meglio esplicitamente box-unbox dei valori in quanto rende il codice più leggibile. Inoltre ci potrebbero essere sottili differenze quando usiamo approcci diversi al pugilato. Ad esempio,

Numero intero i = nuovo numero intero (1);

Integer j = Intero.valueOf (1);

In base a javadoc Integer.valueOf() memorizza nella cache gli oggetti in modo che i == j restituiscano false.

Anche un altro modo per casella esplicitamente una primitiva per intero è

intero k = (Integer) 1; ma in realtà chiama Integer.valueOf().

+0

@bn. Sono d'accordo con questa risposta, a mio parere è meglio esplicitamente box-unbox. Oltre a rendere il codice più chiaro, assicura che non si verifichino mai problemi come quelli menzionati nel collegamento in [questa risposta] (http://stackoverflow.com/a/19512862/2814308). Se la probabilità di questi problemi è piccola o meno non è troppo importante per me perché il prezzo da pagare per ottenere questa certezza (esplicitamente il pugilato-unboxing) è estremamente basso. – SantiBailors

Problemi correlati