Dopo sei mesi di sviluppo, Oracle la piattaforma (Java Platform, Standard Edition 14), la cui implementazione di riferimento è il progetto open source OpenJDK. In Java SE 14 è mantenuta la retrocompatibilità con le versioni precedenti della piattaforma Java; tutti i progetti Java già scritti continueranno a funzionare senza modifiche su questa nuova versione. Sono disponibili pacchetti pronti per l'installazione di Java SE 14 (JDK, JRE e Server JRE) per Linux (x86_64), Windows e macOS. L'implementazione di riferimento sviluppata nel progetto OpenJDK è completamente open source sotto la licenza GPLv2 con eccezioni GNU ClassPath, che consentono il collegamento dinamico con prodotti commerciali.
Java SE 14 è classificato tra le versioni a ciclo di vita standard, con aggiornamenti previsti fino alla prossima release. Per una branch a lungo termine (LTS) si consiglia di utilizzare Java SE 11, con aggiornamenti disponibili fino al 2026. La precedente branch LTS, Java 8, sarà supportata fino a dicembre 2020. Il prossimo rilascio LTS è previsto per settembre 2021. Ricordiamo che a partire dalla release di Java 10, il progetto ha adottato un nuovo processo di sviluppo, che prevede cicli di rilascio più brevi. Ora, le nuove funzionalità vengono sviluppate in un branch master costantemente aggiornato, in cui vengono incluse le modifiche pronte, e da cui si diramano branch per stabilizzare le nuove versioni ogni sei mesi.
Da :
- Supporto sperimentale aggiunto 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 la necessità di definire esplicitamente «String s = (String) obj».
Era:
if (obj instanceof Group) {
Group group = (Group) obj;
var entries = group.getEntries();
}Ora è possibile evitare la definizione «Group group = (Group) obj»:
if (obj instanceof Group group) {
var entries = group.getEntries();
} - È stata aggiunta la supporto sperimentale per la nuova parola chiave ««, che fornisce una forma compatta per definire le classi, consentendo di fare a meno della 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 generiche dei metodi equals(), hashCode() e toString(), è possibile evitarne la definizione esplicita:
public record BankTransaction(LocalDate date,
double amount,
String description) {}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).
- e abilitata di default la supporto della nuova forma di espressioni «switch», che non richiede di specificare l'operatore «break», permettendo di combinare etichette ripetute e consentendo l'uso non solo come operatore ma anche come espressione.
var log = switch (event) {
case PLAY -> «L'utente ha attivato il pulsante di riproduzione»;
case STOP, PAUSE -> «L'utente ha bisogno di una pausa»;
default -> {
String message = event.toString();
LocalDateTime now = LocalDateTime.now();
yield «Evento sconosciuto » + message +
» registrato il » + now;
}
}; - Espansa la supporto sperimentale — nuova forma di letterali stringa, che permette di includere nel codice sorgente dati testuali multilinea senza dover utilizzare l'escaping dei caratteri e mantenendo il formato originale del testo nel blocco. L'incapsulamento del blocco avviene con tre virgolette doppie. In Java 14 nei blocchi di testo è stata implementata la supporto della sequenza di escape «\s» per definire uno spazio e «\» per concatenare con la riga successiva (ignorando il ritorno a capo, quando è necessario stampare una stringa molto lunga). Ad esempio, invece di codice
String html = "<HTML>" +
"\n\t" + "<BODY>" +
«\n\t\t» + «"Java 14 è qui!"
» +
"\n\t" + "</BODY>" +
"\n" + "</HTML>";si può specificare:
String html = """
<HTML>
<BODY>"Java 14
è qui!"</H1>
</BODY>
</HTML>"""; - Aumentata l'informatività della diagnosi in caso di eccezioni . Se in precedenza il messaggio di errore si riferiva solo al numero di riga, ora specifica quale metodo ha generato l'eccezione. La diagnosi estesa è attualmente attivabile solo avviando con il flag «-XX:+ShowCodeDetailsInExceptionMessages». Ad esempio, specificando questo flag, l'eccezione alla riga
var name = user.getLocation().getCity().getName();
porterà a un messaggio di output
Exception in thread «main» java.lang.NullPointerException: Cannot invoke «Location.getCity()»
because the return value of «User.getLocation()» is null
at NullPointerExample.main(NullPointerExample.java:5):5)che permette di capire che il metodo Location.getCity() non è stato invocato, e che User.getLocation() ha restituito un valore null.
- una versione preliminare dello strumento jpackage, che consente di creare pacchetti per applicazioni Java autoconclusive (self-contained). Lo strumento si basa su javapackager di JavaFX e permette di generare pacchetti in formati nativi per diverse piattaforme (msi ed exe per Windows, pkg e dmg per macOS, deb e rpm per Linux). I pacchetti includono tutte le dipendenze necessarie.
- Nel garbage collector G1 nuovo meccanismo di allocazione della memoria, che tiene conto delle specificità del lavoro su grandi sistemi che utilizzano architetture . Un nuovo gestore della memoria si attiva utilizzando il flag «+XX:+UseNUMA» e può aumentare notevolmente le prestazioni nei sistemi NUMA.
- API per il monitoraggio in tempo reale degli 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 la creazione di buffer di byte mappati (MappedByteBuffer) che fanno riferimento a memoria non volat di tipo NVM.
- una versione preliminare dell'API Foreign-Memory Access che consente alle applicazioni Java di accedere in modo sicuro ed efficiente alle aree di memoria al di fuori dell'heap Java, manipolando nuove astrazioni come MemorySegment, MemoryAddress e MemoryLayout.
- porte obsolete per il sistema operativo Solaris e processori SPARC (Solaris/SPARC, Solaris/x64 e Linux/SPARC) con l'intenzione di rimuovere tali porte in futuro. La classificazione di queste porte come obsolete permetterà alla comunità di accelerare lo sviluppo di nuove funzionalità in OpenJDK, senza sprecare tempo a mantenere caratteristiche specifiche per Solaris e SPARC.
- il garbage collector CMS (Concurrent Mark Sweep), che è stato contrassegnato come obsoleto due anni fa e non è più supportato (il garbage collector G1 ha preso il suo posto da tempo). Inoltre, l'uso della combinazione degli algoritmi di raccolta dei rifiuti ParallelScavenge e SerialOld (esecuzione con le opzioni «-XX:+UseParallelGC -XX:-UseParallelOldGC»).
- È stato fornito il supporto sperimentale per il garbage collector ZGC (Z Garbage Collector) sulle piattaforme macOS e Windows (in precedenza supportato solo su Linux). ZGC funziona in modalità passiva, minimizzando il più possibile i ritardi dovuti alla raccolta dei rifiuti (il tempo di arresto durante l'uso di ZGC non supera i 10 ms) e può funzionare sia con heap piccoli che con enormi, da centinaia di megabyte a diversi terabyte.
- strumenti e API per la compressione dei file JAR utilizzando l'algoritmo Pack200.
Fonte: opennet.ru
