Dopo sei mesi di sviluppo, l'azienda Oracle piattaforma (Java Platform, Standard Edition 15), come implementazione di riferimento per il quale viene utilizzato il progetto open source OpenJDK. In Java SE 15 è mantenuta la compatibilità all'indietro con le versioni precedenti della piattaforma Java, tutti i progetti Java precedentemente scritti funzioneranno senza modifiche quando eseguiti con la nuova versione. Le versioni pronte per l'installazione di Java SE 15 (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 15 è classificato come una versione con un normale ciclo di supporto, aggiornamenti per cui verranno rilasciati fino al prossimo rilascio. Si consiglia di utilizzare Java SE 11 come ramo a lungo termine (LTS), per il quale gli aggiornamenti verranno rilasciati fino al 2026. L'ultima versione LTS, Java 8, sarà supportata fino a dicembre 2020. Il prossimo rilascio LTS è previsto per settembre 2021. Ricordiamo che a partire dal rilascio di Java 10, il progetto è passato a un nuovo processo di sviluppo che prevede cicli di rilascio più brevi. La nuova funzionalità è ora sviluppata in un ramo master costantemente aggiornato, nel quale vengono inclusi già i cambiamenti pronti e da cui si diramano rami per la stabilizzazione delle nuove versioni ogni sei mesi.
Da :
- supporto per l'algoritmo di creazione di firme digitali EdDSA (Edwards-Curve Digital Signature Algorithm ). L'implementazione proposta di EdDSA non dipende dalle piattaforme hardware, è protetta da attacchi laterali (garantita la costanza nel tempo di tutti i calcoli) e supera in prestazioni l'implementazione esistente di ECDSA, scritta in linguaggio C, mantenendo lo stesso livello di sicurezza. Ad esempio, EdDSA utilizzando una curva ellittica con chiave a 126 bit mostra prestazioni simili a ECDSA con curva ellittica secp256r1 e chiave a 128 bit.
- supporto sperimentale per classi e interfacce sigillate («sealed»), che non possono essere utilizzate da altre classi e interfacce per ereditarietà, estensione o overriding dell'implementazione. Le classi sigillate offrono anche un modo più dichiarativo di limitare l'uso del supertipo, rispetto ai modificatori di accesso, che si basa sulla enumerazione esplicita delle sottoclassi consentite per l'estensione.
package com.example.geometry;
public sealed class Shape
permits com.example.polar.Circle,
com.example.quad.Rectangle,
com.example.quad.simple.Square {…} - supporto per classi nascoste, che non possono essere utilizzate direttamente dal bytecode di altre classi. Lo scopo principale delle classi nascoste è l'uso in framework che generano dinamicamente classi durante l'esecuzione e le utilizzano in modo indiretto, tramite . Tali classi di solito hanno un ciclo di vita limitato, quindi mantenerle accessibili da classi generate staticamente non è giustificato e porterà solo a un aumento del consumo di memoria. Le classi nascoste consentono anche di evitare l'uso dell'API non standard sun.misc.Unsafe::defineAnonymousClass, che è prevista per essere rimossa in futuro.
- Stabilito e riconosciuto come pronto per l'uso generalizzato il garbage collector ZGC (Z Garbage Collector). ZGC opera in modalità passiva e minimizza 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ò lavorare sia con heap piccoli che enormi, dalle diverse centinaia di megabyte a molti terabyte.
- Stabilito e riconosciuto come pronto per l'uso generalizzato
garbage collector , che lavora con pause minime (Low-Pause-Time Garbage Collector). Shenandoah è stato sviluppato da Red Hat ed è noto per l'uso di un algoritmo che riduce i tempi di arresto durante la raccolta dei rifiuti, effettuando la pulizia parallelamente all'esecuzione delle applicazioni Java. La dimensione dei ritardi causati dal garbage collector è prevedibile e non dipende dalle dimensioni dell'heap, quindi per heap da 200 MB e 200 GB i ritardi saranno identici ( i 50 ms e di solito si attestano attorno ai 10 ms); - Stabilita e introdotta nel linguaggio il supporto — una nuova forma di stringhe letterali, che consente di includere nel codice sorgente dati testuali multilinea senza richiedere l'escape dei caratteri e mantenendo la formattazione originale del testo nel blocco. L'incapsulamento del blocco avviene tramite tre virgolette doppie.
Ad esempio, invece del codice
String html = «<HTML>» +
«\n\t» + «<BODY>» +
"\n\t\t" + "\"Java 15 is here!\"" +
«\n\t» + «<\/BODY>» +
«\n» + «<\/HTML>»;si può specificare:
String html = «»»
<HTML>
<BODY>"Java 15\
è arrivato!»<\/H1>
<\/BODY>
<\/HTML>»»»; - API Legacy DatagramSocket. Le vecchie implementazioni di java.net.DatagramSocket e java.net.MulticastSocket sono state sostituite da un'implementazione moderna, più semplice da debug e manutenzione, e anche compatibile con flussi virtuali, sviluppati nell'ambito del progetto . Nel caso di possibili problemi di compatibilità con il codice esistente, la vecchia implementazione non è stata rimossa e può essere attivata tramite l'opzione jdk.net.usePlainDatagramSocketImpl.
- È stata proposta una seconda implementazione 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();
} - seconda implementazione sperimentale della 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).
- seconda 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 le nuove astrazioni MemorySegment, MemoryAddress e MemoryLayout.
- ed è stata dichiarata obsoleta la tecnica di ottimizzazione Biased Locking, utilizzata nella JVM HotSpot per ridurre i costi di locking. Questa tecnica ha perso rilevanza nei sistemi con istruzioni atomiche fornite dai moderni CPU ed è troppo complessa per essere mantenuta.
- meccanismo obsoleto , che sarà rimosso in una delle prossime versioni. Si osserva che l'RMI Activation è obsoleto, è stato declassato a opzione già in Java 8 e viene raramente utilizzato nelle pratiche moderne.
- motore JavaScript , che è stato dichiarato obsoleto in Java SE 11.
- porting per i sistemi operativi Solaris e processori SPARC (Solaris/SPARC, Solaris/x64 e Linux/SPARC). La rimozione di questi porti permetterà alla comunità di accelerare lo sviluppo di nuove funzionalità di OpenJDK, senza perdere tempo nella manutenzione di caratteristiche specifiche per Solaris e SPARC.
Fonte: opennet.ru
