Dopo sei mesi di sviluppo, l'azienda Oracle piattaforma (Java Platform, Standard Edition 14), la cui implementazione di riferimento è fornita dal progetto open source OpenJDK. In Java SE 14 è mantenuta la retrocompatibilità con le versioni precedenti della piattaforma Java, tutti i progetti Java precedentemente scritti funzioneranno senza modifiche sotto la nuova versione. Le build pronte per l'installazione di Java SE 14 (JDK, JRE e Server JRE) per Linux (x86_64), Windows e macOS. L'implementazione di riferimento sviluppata nell'ambito del progetto OpenJDK è completamente aperta sotto licenza GPLv2 con eccezioni GNU ClassPath, che consentono il binding dinamico con prodotti commerciali.
Java SE 14 è classificato come una versione con ciclo di vita normale, gli aggiornamenti verranno rilasciati fino alla prossima release. Come filone LTS (supporto a lungo termine) si consiglia di utilizzare Java SE 11, gli aggiornamenti per cui verranno rilasciati fino al 2026. Il precedente filone LTS Java 8 sarà supportato fino a dicembre 2020. La prossima release LTS è prevista per settembre 2021. Ricordiamo che a partire dalla release Java 10, il progetto è passato a un nuovo processo di sviluppo, che prevede cicli di rilascio più brevi. Le nuove funzionalità vengono ora sviluppate in un unico branch master, che viene aggiornato continuamente e da cui si diramano branch di stabilizzazione per nuove versioni ogni sei mesi.
Da :
- È stato aggiunto il supporto sperimentale nell'operatore «instanceof», che consente di definire immediatamente una variabile locale per accedere al valore verificato. Ad esempio, si può scrivere direttamente «if (obj instanceof String s && s.length() > 5) {.. s.contains(..) ..}» senza definire esplicitamente «String s = (String) obj».
Era:
if (obj instanceof Group) {
Group group = (Group) obj;
var entries = group.getEntries();
}Ora è possibile omettere la definizione «Group group = (Group) obj»:
if (obj instanceof Group group) {
var entries = group.getEntries();
} - È stato aggiunto il supporto sperimentale per la nuova parola chiave «», che fornisce una forma compatta per definire classi, consentendo di evitare la definizione esplicita di vari metodi a basso livello, come equals(), hashCode() e toString(), nei casi in cui i dati vengono memorizzati solo nei campi, il cui comportamento non cambia. Quando in una classe vengono utilizzate implementazioni predefinite dei metodi equals(), hashCode() e toString(), è possibile evitare la loro definizione esplicita:
record pubblico BankTransaction(LocalDate data,
double importo,
String descrizione) {}Questa dichiarazione porterà all'aggiunta automatica delle implementazioni dei metodi equals(), hashCode() e toString() oltre al costruttore e ai metodi che controllano la modifica dei dati (getter).
- ed è inclusa per impostazione predefinita la supporto per la nuova forma di espressioni «switch», che non richiede l'indicazione dell'operatore «break», consentendo di unire etichette ripetute e ammettendo l'uso non solo come operatore, ma anche come espressione.
var log = switch (evento) {
case PLAY -> «L'utente ha attivato il pulsante di riproduzione»;
case STOP, PAUSE -> «L'utente ha bisogno di una pausa»;
default -> {
String messaggio = evento.toString();
LocalDateTime adesso = LocalDateTime.now();
yield «Evento sconosciuto» + messaggio +
» registrato il » + adesso;
}
}; - Espansa la supporto sperimentale — una nuova forma di letterali stringa che consente di includere nel codice sorgente dati testuali multi-linea senza bisogno di escaping dei caratteri e mantenendo il formato originale del testo nel blocco. L'incapsulamento del blocco è fatto con tre virgolette doppie. In Java 14, nei blocchi di testo è implementato il supporto per la sequenza di escape «\s» per definire uno spazio e «\» per concatenare con la riga successiva (ignorando il ritorno a capo quando si è costretti a generare una stringa molto lunga). Ad esempio, invece del codice
String html = «<HTML>» +
«\n\t» + «<BODY>» +
«\n\t\t» + «<H1>\»Java 14 è qui!\»<\/H1>» +
«\n\t» + «<\/BODY>» +
«\n» + «<\/HTML>»;si può specificare:
String html = «»»
<HTML>
<BODY>
<H1>»Java 14\
è arrivato!»<\/H1>
<\/BODY>
<\/HTML>»»»; - Espansa l'informatività della diagnostica in caso di eccezioni . Se prima il messaggio di errore rimandava solo al numero di riga, ora dettaglia quale metodo ha causato l'eccezione. La diagnostica espansa si attiva al momento della esecuzione con il flag «-XX:+ShowCodeDetailsInExceptionMessages». Ad esempio, specificando questo flag, l'eccezione nella riga
var name = user.getLocation().getCity().getName();
porterà alla visualizzazione del messaggio
Eccezione nel thread «main» java.lang.NullPointerException: Impossibile invocare «Location.getCity()»
perché il valore di ritorno di «User.getLocation()» è nullo
in NullPointerExample.main(NullPointerExample.java:5):5)che permette di capire che il metodo Location.getCity() non è stato invocato, ma User.getLocation() ha restituito un valore nullo.
- una versione preliminare dell'utility jpackage, che permette di creare pacchetti per applicazioni Java autonome (self-contained). L'utility si basa su javapackager di JavaFX e consente di formare pacchetti in formati nativi per diverse piattaforme (msi e exe per Windows, pkg e dmg per macOS, deb e rpm per Linux). I pacchetti includono tutte le dipendenze necessarie.
- Nella raccolta di rifiuti G1 nuovo meccanismo di distribuzione della memoria, tenendo conto delle specificità del lavoro su grandi sistemi che utilizzano l'architettura . Il nuovo distributore di memoria viene attivato tramite il flag «+XX:+UseNUMA» e consente di migliorare significativamente le prestazioni sui sistemi NUMA.
- API per monitorare in tempo reale gli eventi JFR (JDK Flight Recorder), ad esempio per organizzare un monitoraggio continuo.
- modulo jdk.nio.mapmode, che offre nuove modalità (READ_ONLY_SYNC, WRITE_ONLY_SYNC) per creare buffer di byte mappati (MappedByteBuffer) che fanno riferimento alla memoria non volatile (NVM).
- bozza dell'API Foreign-Memory Access, che consente alle applicazioni Java di accedere in modo sicuro ed efficiente alle aree di memoria al di fuori della heap Java, manipolando nuove astrazioni come MemorySegment, MemoryAddress e MemoryLayout.
- obsoleti i port per il sistema operativo Solaris e per i processori SPARC (Solaris/SPARC, Solaris/x64 e Linux/SPARC) con l'intento di rimuovere questi port in futuro. La classificazione di questi port come obsoleti permetterà alla comunità di accelerare lo sviluppo di nuove funzionalità di OpenJDK, senza sprecare tempo nel mantenere caratteristiche specifiche per Solaris e SPARC.
- il garbage collector CMS (Concurrent Mark Sweep), che due anni fa era stato dichiarato obsoleto e non è più supportato (da tempo CMS è stato sostituito dal garbage collector G1). Inoltre, risultato obsoleto l'uso della combinazione di algoritmi di garbage collection ParallelScavenge e SerialOld (esecuzione con le opzioni «-XX:+UseParallelGC -XX:-UseParallelOldGC»).
- È fornito supporto sperimentale per il garbage collector ZGC (Z Garbage Collector) sulle piattaforme macOS e Windows (in precedenza supportato solo su Linux). ZGC opera in modalità passiva, minimizzando il più possibile i ritardi causati dalla garbage collection (il tempo di arresto durante l'uso di ZGC non supera i 10 ms) e può funzionare sia con heap di piccole dimensioni che con enormi heap, che variano da diverse centinaia di megabyte fino a diversi terabyte.
- toolkit e API per la compressione di file JAR utilizzando l'algoritmo Pack200.
Fonte: opennet.ru
