ProgrammazioneSviluppatore Backend

Spiega come funziona il meccanismo di autoboxing e unboxing in Java, quali sono i suoi rischi e dove può portare a errori di prestazioni o di logica.

Supera i colloqui con l'assistente IA Hintsage

Risposta.

Autoboxing è la conversione automatica dei tipi primitivi (int, double ecc.) nei corrispondenti oggetti wrapper (Integer, Double ecc.). Unboxing è la conversione inversa dell'oggetto wrapper indietro nel primitivo.

Funziona automaticamente durante l'assegnazione, i parametri dei metodi e nelle collezioni:

List<Integer> numbers = new ArrayList<>(); numbers.add(5); // Esempio di autoboxing: 5 (int) -> Integer(5) int value = numbers.get(0); // Unboxing: Integer(5) -> 5

Rischi:

  • Possibile NullPointerException durante l'unboxing di null;
  • Uso inefficiente della memoria e del tempo a causa della continua creazione di oggetti wrapper;
  • Complessità con == (confronto per riferimento) ed equals.

Domanda insidiosa.

Può il seguente codice sollevare un'eccezione? Perché?

Integer x = null; int y = x;

Risposta: Il codice solleva NullPointerException, perché nel tentativo di eseguire int y = x; si verifica un unboxing di null nel primitivo, e null non può essere convertito in int.

Esempi di errori reali dovuti all'ignoranza delle sottigliezze dell'argomento.


Storia

Calcolo delle somme in una collezione di wrapper Integer. Ogni volta che la somma aumentava, veniva creato un nuovo oggetto Integer, portando a significativi ritardi su un server reale invece di utilizzare int.

Storia

Un programmatore ha utilizzato Integer come chiave per la cache, non considerando che i valori da -128 a 127 vengono memorizzati in cache, mentre gli altri no. A causa di ciò, == ha improvvisamente iniziato a restituire risultati errati, causando rimozione errata dei dati dalla cache.

Storia

L'API REST riceveva valori nullable. Un semplice unboxing dell'Integer in arrivo a volte portava a un crash a causa del null inaspettato invece di un numero dal client.