Versione Java SE 16

Dopo sei mesi di sviluppo, Oracle ha rilasciato la piattaforma Java SE 16 (Java Platform, Standard Edition 16), la cui implementazione di riferimento utilizza il progetto open source OpenJDK. In Java SE 16 è mantenuta la retrocompatibilità con le versioni precedenti della piattaforma Java; tutti i progetti Java precedentemente scritti funzioneranno senza modifiche con l'esecuzione sotto la nuova versione. Le build pronte per l'installazione di Java SE 16 (JDK, JRE e Server JRE) sono disponibili per Linux (x86_64, AArch64), Windows e macOS. L'implementazione di riferimento di Java 16, sviluppata nell'ambito del progetto OpenJDK, è completamente open source sotto licenza GPLv2 con eccezioni GNU ClassPath, che consentono il collegamento dinamico con prodotti commerciali.

Java SE 16 è classificato come una release con supporto standard, con aggiornamenti previsti fino al prossimo rilascio. Per una versione a lungo termine (LTS), si consiglia di utilizzare Java SE 11, con aggiornamenti rilasciati fino al 2026. Il prossimo rilascio LTS è programmato per settembre 2021. Ricordiamo che a partire dal rilascio di Java 10, il progetto ha adottato un nuovo processo di sviluppo, caratterizzato da cicli di rilascio più brevi. Ora, le nuove funzionalità vengono sviluppate in un master branch continuamente aggiornato, dove vengono incluse le modifiche già pronte, e da cui si diramano branch ogni sei mesi per stabilizzare i nuovi rilasci.

Nella preparazione del nuovo rilascio, lo sviluppo è stato trasferito dal sistema di controllo versioni Mercurial a Git e alla piattaforma di collaborazione GitHub. Ci si aspetta che la migrazione migliori le prestazioni delle operazioni con il repository, aumenti l'efficienza di archiviazione, consenta l'accesso alle modifiche per l'intera storia del progetto, migliori il supporto per la revisione del codice e consenta l'uso delle API per l'automazione dei flussi di lavoro. Inoltre, l'uso di Git e GitHub rende il progetto più attraente per i neofiti e per gli sviluppatori abituati a Git.

Tra le novità di Java 16 possiamo evidenziare:

  • È stato aggiunto un modulo sperimentale jdk.incubator.vector con un'implementazione dell'API Vector, che fornisce funzioni per i calcoli vettoriali eseguiti utilizzando le istruzioni vettoriali dei processori x86_64 e AArch64, permettendo di applicare simultaneamente operazioni a più valori (SIMD). A differenza delle capacità di auto-vectorizzazione per le operazioni scalari fornite dal compilatore JIT HotSpot, la nuova API consente di gestire esplicitamente la vettorizzazione per l'elaborazione parallela dei dati.
  • Nel codice JDK e VM HotSpot, scritto in C++, è consentito utilizzare le funzionalità introdotte dalla specifica C++14. In precedenza, era consentito l'uso degli standard C++98/03.
  • Nel garbage collector ZGC (Z Garbage Collector), che opera in modalità passiva e riduce al minimo i ritardi causati dalla raccolta dei rifiuti, è stata aggiunta la funzionalità di elaborazione parallela degli stack dei thread senza sospendere l'esecuzione dei thread dell'applicazione. In ZGC rimangono ora solo i passaggi che richiedono la sospensione del lavoro, i quali comportano ritardi costanti, solitamente non superiori a poche centinaia di microsecondi.
  • Nelle classi SocketChannel, ServerSocketChannel e java.nio.channels è stata aggiunta il supporto per i socket Unix (AF_UNIX).
  • È stato implementato un porting per la distribuzione Linux Alpine con la libreria C standard musl, popolare negli ambienti per container, microservizi, sistemi cloud e embedded. Il porting proposto in tali contesti consente di eseguire programmi Java come normali applicazioni. Inoltre, grazie a jlink, è possibile rimuovere tutti i moduli non utilizzati e creare un ambiente minimo sufficiente per eseguire l'applicazione, permettendo di generare immagini compatte specifiche per applicazioni particolari.
  • È stato implementato il meccanismo Elastic Metaspace, che ottimizza le operazioni di allocazione e rilascio della memoria occupata dai metadati delle classi (metaspace) nella JVM HotSpot. L'uso dell'Elastic Metaspace riduce la frammentazione della memoria, abbassa le spese generali nel caricatore di classi e ha un effetto positivo sulle prestazioni delle applicazioni server in esecuzione prolungata grazie a un rilascio più rapido della memoria al sistema operativo, occupata dai metadati delle classi non utilizzati. Per selezionare la modalità di rilascio della memoria dopo il caricamento delle classi, è stata proposta l'opzione "-XX:MetaspaceReclaimPolicy=(balanced|aggressive|none)".
  • Aggiunto il porto JDK per i sistemi Windows che operano su hardware con processori basati sull'architettura AArch64.
  • Proposto un terzo prototipo dell'API Foreign-Memory Access, che consente alle applicazioni Java di accedere in modo sicuro ed efficiente a aree di memoria al di fuori dell'heap Java, manipolando le nuove astrazioni MemorySegment, MemoryAddress e MemoryLayout.
  • Realizzato un'API sperimentale Foreign Linker, che fornisce accesso da Java a codice nativo. Insieme all'API Foreign-Memory, questa nuova interfaccia semplifica notevolmente la creazione di wrapper per librerie condivise comuni.
  • Aggiunta l'utilità jpackage, che consente di creare pacchetti per applicazioni Java autoconclusive. L'utilità si basa su javapackager di JavaFX e permette di generare 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.
  • La rigorosa incapsulazione di tutti gli elementi interni del JDK è abilitata per impostazione predefinita, ad eccezione delle API critiche come sun.misc.Unsafe. Il valore dell'opzione «—illegal-access» ora è impostato su «deny» invece di «permit», il che comporterà il blocco dei tentativi di accesso ai più internals classi, metodi e campi. Per aggirare questa limitazione, si dovrebbe usare l'opzione «—illegal-access=permit».
  • È stata stabilizzata l'implementazione del confronto per pattern nell'operatore «instanceof», che consente di definire immediatamente una variabile locale per accedere al valore verificato. Ad esempio, ora è possibile scrivere «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 senza definire «Group group = (Group) obj»: if (obj instanceof Group group) { var entries = group.getEntries(); }
  • È stata stabilizzata l'implementazione della parola chiave «record», che fornisce una forma compatta per definire le classi, consentendo di evitare la definizione esplicita di vari metodi a basso livello come equals(), hashCode() e toString(), nei casi in cui i dati sono memorizzati solo nei campi, il cui comportamento non cambia. Quando in una classe vengono utilizzate implementazioni tipo di 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).

  • È stata proposta una seconda versione preliminare di classi e interfacce sigillate («sealed») che non possono essere utilizzate da altre classi e interfacce per l'ereditarietà, l'estensione o la ridefinizione dell'implementazione. Le classi sigillate offrono anche un modo più dichiarativo per limitare l'uso della superclasse rispetto ai modificatori di accesso, basato su un elenco esplicito 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 {…}

Fonte: opennet.ru

Acquista un hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista un hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster