Per dirla in breve,
- La linea
Integer in = (Integer)y;
utilizza un cast inutile.
- La riga
Integer in = new Integer(y);
crea un'istanza Integer
.
Ogni caso in dettaglio
In primo luogo, prendiamo in considerazione il caso di cast esplicito.
Integer i = (Integer)10;
Il compilatore capisce che 10
è un tipo primitivo int
e il fatto che deve essere avvolto dal suo Integer
per renderlo compila. Sembra javac farà la seguente:
Integer i = (Integer)Integer.valueOf(10);
Ma il compilatore è abbastanza intelligente da fare fusione inutili, (Integer)
appena verrà omessa:
Integer i = Integer.valueOf(10);
Avanti, c'è il caso con la creazione dell'istanza.
Integer i = new Integer(10);
Qui è tutto semplicemente. Una nuova istanza della classe Integer
verrà comunque creata. Ma, come dice la documentazione, di solito, non è il modo appropriato:
Raramente è opportuno utilizzare questi costruttori. Gli stabilimenti statici valueOf()
sono in genere una scelta migliore, poiché è probabile che producano prestazioni significativamente migliori in termini di spazio e tempo.
Conclusione
Nella scrittura di codice di tutti i giorni, usiamo di solito autoboxing and unboxing. Sono conversioni automatiche tra i tipi primitivi e le corrispondenti classi wrapper degli oggetti (è stato introdotto in Java 5). Quindi non è necessario pensare molto ai metodi Xxx.valueOf(xxx)
e .xxxValue()
. È così conveniente, no?
Integer i = 10; // autoboxing
int j = i; // unboxing
Per questa conversione è necessario utilizzare 'Integer.valueOf()'. Da javadoc "Se non è richiesta una nuova istanza Integer, questo metodo dovrebbe generalmente essere utilizzato preferibilmente nel costruttore Integer (int), in quanto è probabile che questo metodo produca prestazioni significativamente migliori in termini di spazio e tempo memorizzando nella cache il valore richiesto frequentemente" – Jens