Classi wrapper in Java

1. Panoramica

Come suggerisce il nome, le classi wrapper sono oggetti che incapsulano tipi Java primitivi.

Ogni primitiva Java ha un wrapper corrispondente:

  • boolean, byte, short, char, int, long, float, double
  • Boolean, Byte, Short, Character, Integer, Long, Float, Double

Questi sono tutti definiti nel pacchetto java.lang , quindi non è necessario importarli manualmente.

2. Classi wrapper

"Qual è lo scopo di una classe wrapper?". È una delle domande di intervista Java più comuni.

Fondamentalmente, le classi generiche funzionano solo con oggetti e non supportano le primitive . Di conseguenza, se vogliamo lavorare con loro, dobbiamo convertire i valori primitivi in ​​oggetti wrapper.

Ad esempio, Java Collection Framework funziona esclusivamente con oggetti. Molto tempo fa, quando (prima di Java 5, quasi 15 anni fa) non esisteva l'autoboxing e, ad esempio, non potevamo semplicemente chiamare add (5) su una raccolta di numeri interi.

A quel tempo, quei valori primitivi dovevano essere convertiti manualmente nelle classi wrapper corrispondenti e archiviati nelle raccolte.

Oggi, con l'autoboxing, possiamo facilmente fare ArrayList.add (101) ma internamente Java converte il valore primitivo in un Integer prima di memorizzarlo in ArrayList utilizzando il metodo valueOf () .

3. Conversione da classi primitive a wrapper

Ora la grande domanda è: come convertire un valore primitivo in una classe wrapper corrispondente, ad esempio un int in Integer o un char in Character?

Bene, possiamo utilizzare metodi di costruzione o factory statici per convertire un valore primitivo in un oggetto di una classe wrapper.

A partire da Java 9, tuttavia, i costruttori per molte primitive in box come Integer o Long sono stati deprecati.

Quindi si consiglia vivamente di utilizzare solo i metodi di fabbrica sul nuovo codice .

Vediamo un esempio di conversione di un valore int in un oggetto Integer in Java:

Integer object = new Integer(1); Integer anotherObject = Integer.valueOf(1);

Il metodo valueOf () restituisce un'istanza che rappresenta il valore int specificato .

Restituisce valori memorizzati nella cache che lo rendono efficiente. Memorizza sempre nella cache i valori compresi tra -128 e 127 ma può anche memorizzare nella cache altri valori al di fuori di questo intervallo.

Allo stesso modo, possiamo anche convertire boolean in Boolean, byte in Byte, char in Character, long in Long, float in Float e double in Double. Tuttavia, se dobbiamo convertire String in Integer, dobbiamo usare il metodo parseInt () perché String non è una classe wrapper.

D'altra parte, per convertire da un oggetto wrapper a un valore primitivo, possiamo usare il metodo corrispondente come intValue (), doubleValue () ecc:

int val = object.intValue(); 

Un riferimento completo può essere trovato qui.

4. Autoboxing e Unboxing

Nella sezione precedente, abbiamo mostrato come convertire manualmente un valore primitivo in un oggetto.

Dopo Java 5, questa conversione può essere eseguita automaticamente utilizzando funzionalità chiamate autoboxing e unboxing.

"Boxing" si riferisce alla conversione di un valore primitivo in un oggetto wrapper corrispondente. Poiché questo può accadere automaticamente, è noto come autoboxing.

Allo stesso modo, quando un oggetto wrapper viene scartato in un valore primitivo, questo è noto come unboxing.

Ciò significa in pratica che possiamo passare un valore primitivo a un metodo che si aspetta un oggetto wrapperoppure assegna una primitiva a una variabile che si aspetta un oggetto:

List list = new ArrayList(); list.add(1); // autoboxing Integer val = 2; // autoboxing

In questo esempio, Java convertirà automaticamente il valore int primitivo nel wrapper.

Internamente, utilizza il metodo valueOf () per facilitare la conversione. Ad esempio, le seguenti righe sono equivalenti:

Integer value = 3; Integer value = Integer.valueOf(3);

Sebbene questo renda la conversione facile e i codici più leggibili, in alcuni casi non dovremmo usare l'autoboxing, ad esempio all'interno di un ciclo .

Simile all'autoboxing, l'unboxing viene eseguito automaticamente quando si passa un oggetto a un metodo che si aspetta una primitiva o quando lo si assegna a una variabile primitiva:

Integer object = new Integer(1); int val1 = getSquareValue(object); //unboxing int val2 = object; //unboxing public static int getSquareValue(int i) { return i*i; }

Fondamentalmente, se scriviamo un metodo che accetta un valore primitivo o un oggetto wrapper, possiamo comunque passare entrambi i valori a loro. Java si occuperà di passare il tipo corretto, ad esempio primitivo o wrapper, a seconda del contesto.

5. conclusione

In questo breve tutorial, abbiamo parlato delle classi wrapper in Java, nonché del meccanismo di autoboxing e unboxing.