# Java 5

Java 5 è la versione 5.0 dell'edizione standard del linguaggio di programmazione Java (in inglese Java 2 Platform Standard Edition o J2SE). Questa versione era inizialmente conosciuta come versione 1.5.0, ma i creatori del linguaggio, per enfatizzarne il livello di maturità e stabilità raggiunto, hanno preferito rinominarla eliminando l'uno iniziale. Il nome in codice di Java 5 durante lo sviluppo era Tiger.
Questa versione è stata pubblicata per la prima volta il 29 settembre 2004 e contiene nuove funzionalità che puntano a semplificare e potenziare il linguaggio stesso. Il codice bytecode prodotto da un compilatore Java 5 può essere eseguito su qualsiasi macchina virtuale Java. Per usufruire quindi delle nuove caratteristiche del linguaggio non è necessario aggiornare la macchina virtuale.
Le nuove caratteristiche del linguaggio hanno permesso di potenziare e semplificare altre componenti standard di Java. Ad esempio gli Enterprise JavaBeans, che fanno parte delle specifiche dell'edizione enterprise di Java, erano noti agli sviluppatori per essere particolarmente complessi da programmare, ma dalla versione 3.0 questo problema è stato risolto grazie all'utilizzo dei metadati.

## Modifiche al linguaggio
### Numero variabile di argomenti

È possibile definire metodi in grado di avere in input un numero qualsiasi di argomenti dello stesso tipo. Utilizzando gli Array si è in grado di ottenere la stessa funzionalità con le versioni precedenti alla 1.5; tuttavia l'utilizzo di una sintassi specifica rende più semplice e leggibile questo tipo di codice.
A titolo di esempio il seguente codice utilizza esclusivamente funzionalità della versione 1.4 di Java:
Quindi, in pratica, il metodo viene definito in modo che accetti come parametro un array, il quale viene poi inizializzato quando il metodo stesso viene richiamato.
Con Java 1.5, lo stesso risultato può essere ottenuto con il seguente codice:

### Output formattato

È stata aggiunta alla classe System la funzione printf che permette una formattazione dell'output simile all'omonima funzione del linguaggio C.
La funzione printf ha il seguente prototipo:

### Tipi generici

I tipi generici o generics permettono di semplificare l'utilizzo di classi che, come ad esempio le classi del package Collection, gestiscono collezioni di oggetti di qualsiasi tipo. Senza l'uso dei tipi generici, la gestione di oggetti di qualsiasi tipo può essere effettuata convertendo preventivamente gli oggetti nel tipo Object, che è la classe da cui derivano tutte le altre. Questa soluzione obbliga il programmatore a utilizzare operazioni di conversione di tipo (casting) ogniqualvolta è necessario prelevare un oggetto dalla collezione; inoltre non è possibile controllare a tempo di compilazione se vi siano errori di conversione di tipo, ad esempio se viene aggiunto alla collezione un tipo di oggetto non valido.
I tipi generici risolvono entrambi questi problemi, ad esempio il seguente codice utilizza esclusivamente le funzionalità di Java 1.4 per aggiungere e successivamente prelevare due stringhe da una collezione di tipo ArrayList :
Con Java 1.5 lo stesso codice può essere scritto nel modo seguente:
In entrambe le versioni vi è un errore di tipo in quanto la variabile s2 non è dichiarata di tipo String (né di una superclasse di String). Tuttavia nella versione 1.4 il codice viene compilato e l'errore viene individuato solo a tempo di esecuzione, mentre con la versione 1.5 l'errore è individuato a tempo di compilazione perché si è dichiarata la variabile lista come una collezione di oggetti di tipo String.

### Metadati

I metadati permettono di associare informazioni aggiuntive alle classi, alle interfacce, ai metodi e ai campi di un programma Java. Queste informazioni aggiuntive, dette anche annotazioni, possono essere lette e processate sia dal compilatore Java che da altri strumenti, e possono essere memorizzate nei file.class prodotti dal compilatore per essere poi lette a tempo di esecuzione tramite le apposite funzioni di introspezione messe a disposizione dal linguaggio.
I metadati, in combinazione con strumenti in grado di elaborarli, possono rendere molto più concisa la sintassi di un programma Java. Ad esempio, per definire i metodi remoti di una classe senza usufruire dei metadati sarebbe necessario scrivere un codice simile al seguente:
con i metadati si può ottenere un risultato analogo con un codice molto più semplice e leggibile:

### Autoboxing

L'autoboxing permette di fare una conversione di tipo automatica tra un tipo primitivo e la sua classe equivalente. Ad esempio nel codice seguente viene effettuata una conversione automatica della variabile i dal tipo primitivo int al tipo Integer, e il valore risultante viene assegnato alla variabile i_oggetto:
Anche questa modifica va nella direzione di una maggiore leggibilità del codice, in quanto elimina la necessità di effettuare una esplicita conversione di tipo.

### Ciclo for migliorato (ciclo foreach)

Il ciclo for è stato migliorato in modo da eliminare la necessità dell'uso degli iteratori, fornendo così una sintassi più semplice e meno soggetta ad errori. Ad esempio, il seguente è un frammento di codice Java 1.4:
Nella versione 1.5 lo stesso codice può essere scritto nel modo seguente:

### Tipo enumerazione

Il tipo enumerazione permette di definire una serie di valori costanti, senza dover esplicitamente assegnare ad ognuno di essi un corrispondente valore numerico. Ad esempio, in Java 1.4 una enumerazione può essere definita nel modo seguente:
In Java 1.5 si può utilizzare la parola chiave enum per definire lo stesso tipo di valori:

### Importazione delle costanti statiche

L'importazione delle costanti statiche permette di fare uso di costanti statiche di una classe o di una interfaccia senza il bisogno di dover derivare da quella classe o implementare quell'interfaccia. Per eseguire questo tipo di importazione si usa la parola chiave import static, ad esempio: