Domanda

In Java, posso scrivere un codice come questo

Boolean b = true ;

E funzionerà. Ora ho un oggetto che contiene il valore "vero".

Come funziona? Perché non devo passare il valore attraverso un costruttore? Così:

Boolean b = new Boolean( true ) ;

Inoltre, posso fare classi personalizzate che posso istanziare in modo simile? In tal caso come si chiama?

In modo che io possa fare qualcosa del genere:

Foobar foobar = "Test" ; 

E quindi ho la mia classe di avvolgimento.

Grazie

È stato utile?

Soluzione

No, non puoi fare quest'ultimo.

Il primo è chiamato autoboxing ed è stato introdotto in Java V1.5 per avvolgimento automatico, primitivi nella loro controparte wrapper.

Il vantaggio dell'autoboxing potrebbe essere stato chiaramente visto quando si utilizza generici e/o raccolte:

Dall'articolo: J2SE 5.0 in poche parole

Nel "Autoboxing e auto-unboxing di tipi primitivi" campione che abbiamo:

Prima (AutoBoxing è stato aggiunto)

ArrayList<Integer> list = new ArrayList<Integer>();
list.add(0, new Integer(42)); 
int total = (list.get(0)).intValue();

Dopo

 ArrayList<Integer> list = new ArrayList<Integer>();
 list.add(0, 42);
 int total = list.get(0);

Come vedi, il codice è più chiaro.

Tieni presente l'ultima nota sulla documentazione:

Quindi, quando dovresti usare l'autoboxing e unboxing? Usali solo quando c'è una "mancata corrispondenza dell'impedenza" tra tipi di riferimento e primitivi, ad esempio quando è necessario inserire valori numerici in una raccolta. Non è appropriato utilizzare l'autoboxing e unboxing per il calcolo scientifico o altro codice numerico sensibile alle prestazioni. Un intero non è un sostituto di un int; Autoboxing e unboxing sfigano la distinzione tra tipi primitivi e tipi di riferimento, ma non la eliminano.

Altri suggerimenti

Come funziona?

È una caratteristica del compilatore. Il compilatore genererà automaticamente l'operazione di boxe. Quello che farà effettivamente è generare

Boolean.valueOf(true);

Perché in questo modo le istanze (immutabili) esistenti booleane.true e boolean.false verranno utilizzate invece di crearne una nuova.

È lo stesso modo in cui puoi creare oggetti stringa in quanto tale:

String s = "foobar"

È solo un vantaggio in Java, davvero. Non sono sicuro del motivo per cui vorresti creare la tua classe di avvolgimento, considerando che qualsiasi tipo di dati primitivo ha già un involucro predefinito ...

Questa funzione è stata aggiunta a Java 1.5 e si chiama Autoboxing. Questo tipo di magia disponibile solo per valori primitivi e involucri corrispondenti.

E non puoi farlo da solo in Java. Se lo vuoi ancora, piuttosto Scala - è ottimo! Vale a dire puoi usare la funzione chiamata conversioni implicite. Ecco un piccolo esempio per il tuo caso:

case class Foobar(value: String)
implicit def convertStringToFoobar(s: String) = Foobar(s)
val foobar: Foobar = "Test";

No, è solo la magia del compilatore; li tratta come casi speciali (noti come autoboxing). Vedi ad es http://download.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html.

È chiamato autoboxing Ed è fondamentalmente solo qualcosa che il compilatore fa per te. È stato aggiunto solo in Java 5, prima che tu dovessi usare new Boolean( true ), o meglio) Boolean.TRUE.

E no, non puoi averlo per le tue lezioni, è fatto solo per le lezioni di avvolgimento primitivo.

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