Principali novità di Java 7 con codici di esempio
Secondo il calendario pubblicato, la versione finale di Java7 sarà rilasciata il 28 luglio 2011.
Sono già disponibili delle early build con le nuove features ma ovviamente non sono stable build.
Le migliorie del linguaggio:
- Invoke dynamic: estensione della JVM per rendere più facile e performante l’esecuzione dei linguaggi dinamici che girano con la JVM (es. Python). Permetterà ancora più ampia diffusione della JVM, ottimo!
- Modularizzazione: razionalizzazione delle librerie per ridurre le dipendenze fra le classi della JVM. Scopo: migliorare bootstrap della JVM (avvio) e diminuire il memory footprint
- Annotazioni sui tipi. Lo dice il nome.
Vediamo quali sono le principali novità a livello di codice (con degli esempi!):
- Null checking
- Automatic Resource Management (ARM)
- Language support for collections
- Improved exception handling
- Strings in switch
- Improved type inference
Null Checking:
before:
1 2 |
if(o!=null) { Object o2=o.getSomething() if(o2!=null) return o2.getSomethingElse() }; return null; |
after:
1 |
return o?.getSomethingh()?.getSomethingElse(); |
Automatic Resource Management (ARM)
before:
1 2 3 4 5 6 |
BufferedReader br = new BufferedReader(new FileReader(path)); try { return br.readLine(); } finally { br.close(); } |
after:
1 2 3 |
try (BufferedReader br = new BufferedReader(new FileReader(path)) { return br.readLine(); } |
Chiamata implicita al close() alla fine del blocco try, valido per molti tipi di risorse, un file, una connessione al db, qualsiasi oggetto che attualmente deve chiamare esplicitamente la close()
Language support for collections
1 2 3 4 5 |
List<String> list = ["item"]; String item = list[0]; Set<String> set = {"item"}; Map<String, Integer> map = {"key" : 1}; int value = map["key"]; |
Improved exception handling
before:
1 2 3 4 5 6 7 |
} catch (FirstException ex) { logger.error(ex); throw ex; } catch (SecondException ex) { logger.error(ex); throw ex; } |
after:
1 2 3 4 |
} catch (FirstException | SecondException ex) { logger.error(ex); throw ex; } |
Strings in switch
1 2 3 4 5 6 7 |
static boolean booleanFromString(String s) { switch(s) { case "true": return true; case "false": return false; } |
Improved type inference
1 |
Map<String, List<String>> anagrams = new HashMap<>(); |
non è necessario riscrivere “<String, List<String>>” nella new