Java 8: le principali novità

9 giugno 2014

Java 8 è la prima edizione interamente Made in Oracle per cui vi era un’attesa alimentata da dubbi, timori e curiosità derivanti dall’acquisizione della Sun da parte di Oracle. L’attenzione di buona parte della comunità internazionale del software è ora volta a cercare di capire quale sarà l’effettivo supporto della Oracle al mondo Java e alla sua evoluzione, questa major release servirà a delinearne le prospettive.

Questa versione prometteva nuove caratteristiche e migliorie in diverse aree funzionali, maggiore produttività degli sviluppatori, incrementi significativi delle prestazioni mediante collezioni e annotazioni migliorate, modelli di programmazione parallela semplificati e utilizzo più efficiente dei processori multi-core.

Nel corso di questa trattazione vedremo cosa ci offre di nuovo Java 8. La prima osservazione che possiamo fare è che il numero di packages della Standard Edition è aumentato leggermente, dai 209 della versione precedente agli attuali 217.

Espressioni Lambda e metodi default

Le espressioni Lambda costituiscono la principale novità per il linguaggio di programmazione Java. Il focus in Java è sempre stato sui dati (classi, ereditarietà, generics, etc.), con questa particolare funzione l’attenzione si muove verso il comportamento.

Si è visto che volendo modellare un flusso del tipo “fai A prima di iniziare, quindi effettua B per ogni file in questo gruppo, C se individui un errore, e infine D quando hai finito“, non vi sono strumenti idonei a esprimere tale comportamento e ciò impatta sulle API, ad esempio costringendo il codice client ad un coinvolgimento diretto in ogni passo.

Le espressioni lambda sono lo strumento individuato per superare questo problema. Sono collegate al concetto di funzione anonima, ossia una funzione che ha un corpo ma non un nome. Un’espressione lambda definisce una funzione anonima che mantiene lo stato. In pratica un metodo senza una dichiarazione e quindi senza nome, modificatori d’accesso, dichiarazione del tipo del valore di ritorno.

La loro sintassi è qualcosa di simile:

(arg1, arg2) -> {body}

Ad esempio:

(int a, int b) -> {return a+b;}

Volendo confrontare codice scritto senza e con le espressioni lambda, osserviamo l’implementazione del comportamento di un pulsante prima e dopo.

//Prima:
button.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("Sintassi arcinota!");
    }
});
 
//Dopo:
button.addActionListener( (e) -> {
        System.out.println("Nuova sintassi!");
});

Di seguito un altro esempio in cui utilizziamo l’espressione lambda per una semplice stampa a video. L’espressione lambda compare due volte, la prima come fatto in precedenza, nella seconda invece vediamo che è possibile convertire un metodo normale in una espressione lambda mediante l’operatore doppio due punti (::).

//Prima:
List list1 = Arrays.asList(1,2,3,5);
for(Integer n: list1) {
    System.out.println(n);
}
 
//Dopo:
List list2 = Arrays.asList(1,2,3,5);
list2.forEach(n -> System.out.println(n)); 
 
//Espressioni lambda e doppio due punti
list2.forEach(System.out::println);

Altra novità per il linguaggio Java è costituita dai metodi default, nuove funzionalità che possono essere aggiunte alle interfacce delle librerie. E’ ora possibile aggiungere nuovi metodi alle interfacce garantendo al contempo la compatibilità dei compilati con codice scritto per vecchie versioni delle interfacce (retrocompatibilità). Come immaginabile dal nome, le classi che implementano l’interfaccia ma non effettuano l’override del metodo in caso di invocazione di tale metodo offriranno l’implementazione di default.

Nashorn e Javascript

Nashorn permette a Java 8 di eseguire JavaScript sulla JVM. Nashorn è un engine incluso nella JDK per permettere a qualsiasi applicazione Java di contenere parti scritte in JavaScript. Inoltre, un tool a riga di comando (jjs) permette agli sviluppatori di usare Nashorn come tool di scripting consentendo la generazione di applicazioni JavaScript autoportanti. In pratica, va ad occupare il posto di Rhino, JavaScript engine anch’esso Open Source, promettendo migliori performance e un’integrazione maggiore tra mondo Java e mondo JavaScript.

L’idea è che gli sviluppatori di JavaScript possano utilizzare la ricchezza di librerie presenti in Java e implementare caratteristiche dinamiche bypassando cicli di build, mentre gli utenti possono cambiare configurazioni evitando di rigenerare l’applicazione.

Profili compatti

Avete sempre desiderato di potere istanziare un sottoinsieme della piattaforma Java? I profili compatti permettono di farlo, consentendo alle applicazioni che non richiedono l’intera piattaforma di essere lanciate anche su dispositivi dalle capacità ridotte.

Tutto ciò si è ottenuto tramite l’identificazione di tre sottoinsiemi delle API di Java 8, offrendo la convergenza tra Java ME CDC (Connected Device Configuration) e Java 8. Il più piccolo di questi profili (denominati compact1, compact2 e compact3) richiede attorno agli 11 MB, ossia meno di quattro volte del tradizionale JRE (Java Runtime Environment), evidentemente pensato per lavorare su piattaforme con vincoli pressanti in termini di risorse disponibili o di performance / tempi di start up. Inoltre, l’eliminazione di codice inutilizzato può risultare utile dal punto di vista della prospettiva della sicurezza e per ridurre i tempi di download delle applicazioni.

Il timore lato Sun/Oracle si basa sul rischio di una eccessiva frammentazione della Java SE, con la prospettiva di infinite varianti e sotto varianti praticamente ingestibili. Ma i vantaggi hanno prevalso sui timori e si è proceduto a questa prima suddivisione delle librerie, anche se l’implementazione completa del concetto di piattaforma modulare è da rimandarsi a Java 9. E di fatti parliamo di profili e non di moduli, dove ogni profilo è un insieme che include il precedente (compact2 include compact1, e compact3 include compact2, includendo pertanto anche compact1).

Se guardiamo alle librerie incluse nei vari profili, nel profilo base troveremo tra le altre le immancabili java.io, java.lang, java.net e java.util, oltre alle librerie per la sicurezza java.security e javax.security. Nel secondo profilo si evidenza la presenza di java.rmi, java.sql e buona parte delle librerie per l’XML. Nel terzo profilo compaiono le javax.management, javax.naming e javax.xml.crypto.

Abbiamo visto che il profilo più compatto si attesta attorno agli 11 MB. Il maggiore attorno ai 21 MB, ben al di sotto della metà di una classica Java SE 7.

Nella prossima e ultima parte di questa trattazione concluderemo il nostro discorso su Java 8 introducendo alcune altre novità rilevanti di tale aggiornamento.

Se vuoi aggiornamenti su Java 8: le principali novità inserisci la tua e-mail nel box qui sotto:
 
X
Se vuoi aggiornamenti su Java 8: le principali novità

inserisci la tua e-mail nel box qui sotto:

Ho letto e acconsento l'informativa sulla privacy

Acconsento al trattamento di cui al punto 3 dell'informativa sulla privacy