2009-04-20 11 views

risposta

16

L'hai semplificato un po 'troppo.

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

collezioni possono contenere solo riferimenti a oggetti, in modo da avere a scatola valori primitivi nella classe wrapper appropriata. ... Quando si estrae l'oggetto dalla raccolta, si ottiene l'intero che si inserisce; se hai bisogno di un int, devi scollegare il numero intero usando il metodo intValue. Tutta questa boxe e unboxing è un dolore e ingombra il tuo codice. La funzione di autoboxing e unboxing automatizza il processo, eliminando il dolore e il disordine.

Quindi, quando si dovrebbe utilizzare autoboxing e unboxing? Usali solo quando c'è un "disadattamento di impedenza" tra i tipi di riferimento e le primitive, ad esempio quando devi inserire valori numerici in una raccolta. Non è appropriato utilizzare la funzione di autoboxing e unboxing per il calcolo scientifico o altri codici numerici sensibili alle prestazioni. Un intero non è un sostituto di un int; autoboxing e unboxing offuscano la distinzione tra tipi primitivi e tipi di riferimento, ma non li eliminano.

Great overview of Autoboxing

1

Rende il codice più leggibile e più ordinato. Soprattutto se stai facendo operazioni (Dato che Java non ha sovraccarico dell'operatore).

1

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

+1

Quali limitazioni? –

+4

Da dove cominciare? L'API Time-Date, la mancanza di un'API Collections dall'inizio, gli array sono oggetti "leggeri" e non sostituiscono Object.equals(), la mancanza di Generics dall'inizio, il meccanismo di clonazione "strano" ... Alla fine trova sottili scricchiolii nella lingua, o leggi di loro e come sono stati patchati. Alla fine della giornata, Java era un linguaggio incorporato rivitalizzato per il boom delle dot-com, e mostra. Preferisco C#, nonostante sia Microsoft. –

3

Questa è l'idea, sì. Tuttavia, è ancora più comodo poter assegnare un intero a un int.

Si potrebbe sostenere che gli indirizzi autoboxing un sintomo, piuttosto che una causa. La vera fonte di confusione è che il sistema di tipi di Java è incoerente: la necessità sia di primitive che di riferimenti a oggetti è artificiale e scomoda. Autoboxing lo attenua un po '.

+0

Cosa c'è di strano nell'avere primitive? Vuoi dire che toglie la natura puramente object oriented della lingua? In Ruby, per esempio, anche gli interi sono oggetti. È questo che vuoi dire? –

+0

Non vedo davvero perché è un grosso problema. Penso che dovrebbero essere lasciati abbastanza bene da soli. Questo non sembra aggiungere molto, da quello che posso dire finora. Naturalmente, ho appena saputo di questa funzionalità circa cinque minuti fa. –

+0

Sì, questo è ciò che intendo. Non sono un purista OO da nessuna parte, ma non è ovvio perché un programmatore trae beneficio dall'avere sia un int che un Integer a loro disposizione. Penso che un'astrazione dovrebbe essere sufficiente per coprire "l'intero-nesso". – jcrossley3

1

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 può causare problemi.

+0

Cosa intendi? –

+0

Poiché le primitive vengono sempre copiate quando vengono passate. Non credo che questo sia vero per le loro controparti in scatola. – CookieOfFortune

1

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.

1

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

7

proposito

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 (Apparentemente questo sarà accordabili se Java 6u14)

+0

Grazie! Era molto confuso perché solo a volte veniva creato un nuovo oggetto! – DustByte

+0

@DustByte perché può solo memorizzare nella cache gli oggetti comuni. La memorizzazione nella cache di ogni intero utilizzerà 40 GB di memoria (solo per i numeri interi) –

5

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 singoli numeri interi è necessario utilizzare il tipo int, non il numero intero. L'intero è per lo più utilizzato nelle raccolte.

Attenzione che a Long è diverso dallo stesso valore di un intero (usando equals()), ma da lungo è uguale a un int (usando ==).