Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Java 9, tutte le novità

Scopriamo tutte le novità di Java 9, dal supporto alla programmazione modulare fino alle nuove API per sistema, multimedia, sicurezza e protocolli di rete.
Scopriamo tutte le novità di Java 9, dal supporto alla programmazione modulare fino alle nuove API per sistema, multimedia, sicurezza e protocolli di rete.
Link copiato negli appunti

In attesa del rilascio della prima versione stabile di Java 9 previsto per il 21 settembre
andiamo a presentare le nuove caratteristiche introdotte dalla
piattaforma.

Programmazione modulare

Tra i diversi ed interessanti cambiamenti,
evidenziamo l'introduzione della programmazione modulare attraverso il
Java Platform Module System (JPMS), risultato del progetto "Jigsaw",
e della JShell per il testing e l'esplorazione rapida delle
funzionalità del linguaggio.

La modularità prevede un meccanismo per la
dichiarazione della dipendenza dei moduli individuabile sia a
compilation time che a runtime, in modo tale che il sistema sia in
grado di muoversi all'interno delle dipendenze per determinare i
moduli di cui un'applicazione ha bisogno.

Con la modularità in Java 9 abbiamo un forte incapsulamento, i packages
all'interno di un modulo sono accessibili ad altri moduli soltanto se
il modulo li esporta esplicitamente. Essa introduce inoltre
maggiore scalabilità.

In precedenza la piattaforma Java consisteva in
un blocco monolitico e in un gran numero di packages difficili da
mantenere e aggiornare, il sistema è adesso modularizzato in 95 moduli
ed è possibile creare runtime personalizzabili scegliendo i moduli di
cui si ha bisogno.

Un modulo può essere visto come un'aggregazione di alto livello
di packages Java relazionati e di risorse di natura diversa come
immagini, file XML ecc. Ogni modulo ha un nome univoco, supporta la
reflection, può dichiarare dipendenze da altri moduli, deve dichiarare
esplicitamente i packages che intende rendere disponibile ad altri
moduli, i servizi che offre, ed infine i servizi utilizzati.

La
struttura applicativa di un modulo è molto simile ad un normale
progetto Java su libreria (JAR), l'aspetto fondamentale è la
presenza di un file di configurazione, denominato module-info.java, di
cui riportiamo un semplice esempio:

module it.html.welcome.java9 {
   requires java.base;
  }

REPL e JShell

Java 9 introduce il suo REPL (read-evaluate-print loop)
attraverso la JShell. La JShell offre un ambiente a riga di
comando che consente di esplorare e sperimentare facilmente aspetti
del linguaggio come istruzioni, classi, metodi e molto altro.

Ad
esempio, invece di scrivere un classe di prova per testare il
funzionamento di un blocco di codice che implementa un
algoritmo, possiamo digitare ed eseguire direttamente il nostro codice
inserendolo nella shell.

Supponiamo di
voler testare il funzionamento dell'istruzione System.out.println(),
normalmente realizzeremmo una classe di test di questo tipo:

class MyClass {
   public static void main(String[] args) {
    System.out.println("Hello Java 9!");
   }
  }

La JShell consente di evitare la realizzazione della classe
digitando ed eseguendo direttamente l'istruzione:

jshell>System.out.println("Hello Java 9!")
  Hello Java!
  jshell>

Anche le API del linguaggio hanno subito cambiamenti importanti con Java 9, analizziamone i
più interessanti.

All'interno delle interfacce è adesso possibile
dichiarare metodi privati:

interface MyInterface {
   private void myPrivateMethod(){..}
  }

Il Try-With-Resources è stato poi migliorato consentendo operazioni
come le seguenti:

void dbMethod(Connection conn) {
    try(conn) {
       ..
    }
  }

In precedenza eseguibili soltanto tramite:

void dbMethod(Connection conn) {
    try(Connection c = conn) {
       ..
    }
 }

Le API per l'interazione con i processi del sistema operativo sono state potenziate, ad esempio l'esecuzione del comando
ls di Linux e il suo output come input del comando grep per filtrare
file txt si realizzerebbe facilmente come:

ProcessBuilder lsCmd = new ProcessBuilder().command("ls").directory(Paths.get("/").toFile());
  ProcessBuilder grepTxtCmd = new ProcessBuilder().command("grep", "txt").redirectOutput(Redirect.INHERIT);
  List<Process> lsPlusGrep = ProcessBuilder.startPipeline(Arrays.asList(lsCmd, grepTxtCmd));

In ambito multimediale è stata introdotta la classe
MultiResolutionImage che incapsula un insieme di immagini con
differenti risoluzioni consentendo query di selezione basate su
altezza e larghezza dell'immagine.

Con Java 9 è stato introdotto il Reactive
Programming
attraverso le Reactive Streams API. Queste API realizzano
essenzialmente un framework di tipo Publish/Subscribe per l'implementazione di
applicazioni asincrone, scalabili e parallele in modo molto semplice
utilizzando il linguaggio Java.

Altri miglioramenti si registrano lato
Stream API. Gli sviluppatori hanno aggiunto nuovi metodi all'interfaccia
java.util.Stream. Particolarmente interessanti sono i metodi dropWhile()
e takeWhile() nell'ambito della realizzazione di codice in stile
funzionale.

Ad esempio takeWhile() prende in input un predicato e
restituisce un sotto-stream dei valori dello stream principale,
interrompendosi quando il predicato restituisce il valore false per la
prima volta. Se questo non accade si restituisce uno stream vuoto.

Esempio da JShell:

jshell> Stream.of(1,2,3,4,5).takeWhile(i -> i < 3 ).forEach(System.out::println);
1
2

A livello di collezioni, Java 9 introduce nuovi utili
metodi per creare liste, insiemi e mappe immutabili.

Esempio da JShell:

jshell> Map immutableMap = Map.of(1, "Element 1", 2, "Element 2", 3, "Element 3")
immutableMap ==> {2=Element 2, 3=Element 3, 1=Element 1}

Il miglioramento delle API non si ferma qui ma si estende anche ai
protocolli di rete e alla sicurezza. Java 9 introduce il
supporto a client HTTP/2 all'interno del package java.net.http
supportando sia il funzionamento sincrono (Blocking Mode) che quello
asincrono con l'utilizzo delle API WebSocket.

Nelle reti di computer i
Datagrams forniscono un meccanismo di scambio delle informazioni non
orientato alla connessione, Java 9 aggiunge il supporto al protocollo
DTLS (Datagram Transport Layer Security) che fornisce una
comunicazione sicura attraverso Datagrams.

I certificati di sicurezza
X.509 sono utilizzati nella crittografia a chiave pubblica, Java 9
migliora il loro impiego consentendo di verificare se un certificato
X.509 è ancora valido
(OCSP Stapling for TLS).

Infine, con TLS Application-Layer
Protocol Negotiation Extension
abbiamo un miglioramento alla sicurezza nel
package javax.net.ssl per consentire alle applicazioni di scegliere
protocolli da una lista per comunicare in modo sicuro.

Ti consigliamo anche