Autoboxing: Così posso scrivere: Integer i = 0; invece di: Integer i = new Integer (0);

StackOverflow https://stackoverflow.com/questions/766468

  •  12-09-2019
  •  | 
  •  

Domanda

Autoboxing sembra venire giù per il fatto che posso scrivere:

Integer i = 0; 

invece che:

Integer i = new Integer(0);

Quindi, il compilatore in grado di convertire automaticamente un primitivo a un oggetto.

è che l'idea? Perché questo è importante?

È stato utile?

Soluzione

Si tipo di semplificò un po 'troppo.

Autoboxing entra in gioco anche quando si usano le collezioni. Come spiegato nella documentazione Java di Sun:

  

Le collezioni possono contenere solo riferimenti a oggetti, in modo da avere a scatola valori primitivi nella classe wrapper appropriata. ... Quando si prende l'oggetto di raccolta, si ottiene l'intero che si mette in; se avete bisogno di un int, è necessario Unbox l'intero utilizzando il metodo intValue. Tutto questo boxe e unboxing è un dolore, e ingombra il vostro codice. L'autoboxing e dispongono di unboxing automatizza il processo, eliminando il dolore e il disordine.

     

Quindi, quando si dovrebbe usare autoboxing e unboxing? Utilizzare solo quando v'è un “disadattamento di impedenza” tra tipi di riferimento e primitive, ad esempio, quando si deve inserire valori numerici in una collezione. Non è opportuno utilizzare autoboxing e unboxing per il calcolo scientifico, o altro codice numerico prestazioni sensibili. Un intero non è un sostituto per un int; autoboxing e unboxing confusione tra tipi primitivi e tipi di riferimento, ma non eliminano.

Grande rassegna di Autoboxing

Altri suggerimenti

tra

Integer i = 0;

è equivalente a

Integer i = Integer.valueOf(0);

La distinzione è che valueOf () non crea un nuovo oggetto per valori compresi tra -128 e 127 (A quanto pare questa sarà accordabili se Java 6u14)

Esiste in modo che è possibile scrivere codice come

List<Integer> is = new ArrayList<Integer>();
is.add(1); // auto-boxing
is.add(2);
is.add(3);

int sum = 0;
for (int i : is)  // auto-unboxing
{
    sum += i;
}

Per i singoli numeri interi si dovrebbe di default utilizzare il tipo int, non Integer. Integer è per lo più per l'utilizzo in collezioni.

Attenzione che un lungo è diverso dallo stesso valore di un intero (mediante equals ()), ma come un tempo è uguale a un int (utilizzando ==).

Questa è l'idea, sì. E 'ancora più comodo poter assegnare un numero intero a int, però.

Si potrebbe obiettare che autoboxing indirizzi un sintomo piuttosto che una causa. La vera fonte di confusione è che il sistema di tipo Java è inconsistente: la necessità per entrambe le primitive e riferimenti oggetto è artificiale e scomodo. Autoboxing mitiga che in qualche modo.

Con il mio cappello cinico: per make-up per le limitazioni sul originale Java (intendo Oak qui) spec. Non solo la prima volta.

rende il codice più leggibile e più ordinato. Specialmente se si sta facendo le operazioni (Dal momento che Java non ha l'overloading degli operatori).

Da quello che mi ricordo dalla lettura di Joshua Bloch Effective Java, si dovrebbe prendere in considerazione le primitive sopra le loro controparti in scatola. Autoboxing senza riguardo per i suoi effetti collaterali possono produrre problemi.

L'aggiunta al commento di Lim, primitive sono memorizzati sullo stack, e primitive-involucri, come oggetti, vengono memorizzati sul mucchio ... Ci sono sottili implicazioni a causa di questo.

Il vantaggio principale sarebbe la leggibilità, zucchero sintattico in fondo. Java è già molto prolisso, Sun sta cercando tutti i modi per rendere la sintassi più breve.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top