Dopo sei mesi di sviluppo, Oracle ha pubblicato la piattaforma Java SE 23 (Java Platform, Standard Edition 23), di cui si utilizza il progetto OpenJDK come implementazione di riferimento. A parte la rimozione di alcune funzionalità obsolete, Java SE 23 mantiene la retrocompatibilità con le versioni precedenti della piattaforma Java: la maggior parte dei progetti Java precedentemente scritti funzionerà senza modifiche su questa nuova versione. Le build pronte per l'installazione di Java SE 22 (JDK, JRE e Server JRE) sono state preparate per Linux (x86_64, AArch64), Windows (x86_64) e macOS (x86_64, AArch64). L'implementazione di riferimento di Java 23, sviluppata all'interno del progetto OpenJDK, è completamente open source sotto la licenza GPLv2 con eccezioni GNU ClassPath, che consentono il binding dinamico con prodotti commerciali.
Java SE 23 è classificato come una versione con supporto standard, con aggiornamenti previsti fino al rilascio successivo. Per le versioni con supporto a lungo termine (LTS), si consiglia di utilizzare Java SE 21 o Java SE 17, con aggiornamenti disponibili fino al 2031 e al 2029 rispettivamente (pubblici fino al 2028 e 2026). Il supporto esteso per la versione LTS di Java SE 8 durerà fino al 2030, mentre per Java SE 11 fino al 2032.
Tra le novità introdotte in Java SE 23:
- Il generational mode del garbage collector ZGC (Generational Z Garbage Collector) è abilitato per impostazione predefinita; esso utilizza un'elaborazione separata per gli oggetti 'vecchi' e 'giovani', migliorando l'efficienza della pulizia degli oggetti recentemente creati con vita breve. L'adozione del Generational ZGC riduce i rischi di interruzioni durante l'allocazione delle risorse, diminuendo il carico sulla CPU e il consumo di memoria durante la raccolta dei rifiuti. I test del Generational ZGC con Apache Cassandra 4 hanno mostrato un aumento della capacità di elaborazione di 4 volte a dimensioni fisse dell'heap e una riduzione della dimensione dell'heap del 25% mantenendo la stessa capacità di elaborazione.
- In JavaDoc, è stata aggiunta la supporto per l'uso della markup Markdown per documentare il codice nei commenti, che può essere utilizzato invece di una combinazione di HTML e @-tag JavaDoc.

- I meccanismi di corrispondenza sono stati ampliati con il supporto preliminare per l'uso di tipi primitivi (int, byte, char e altri tipi di base non oggetto) in tutti i tipi di modelli, nell'operatore «instanceof» e nei blocchi «switch». switch (x.getStatus()) { case 0 -> «okay»; case 1 -> «warning»; case 2 -> «error»; case int i -> «unknown status: » + i; } if (i instanceof byte b) { … b … }
- È stato aggiunto il supporto preliminare per l'utilizzo di un'unica espressione «import module M» per importare tutti i pacchetti esportati dal modulo specificato. Questa modifica semplifica notevolmente il riutilizzo delle librerie modulari, consentendo di collegare librerie e classi senza definire la loro posizione nella gerarchia dei pacchetti. Ad esempio, specificare «import module java.base» importerà tutti i 54 pacchetti inclusi nel modulo java.base, che in precedenza avrebbero dovuto essere menzionati singolarmente («import java.io.*», «import java.util.*», ecc.).
È stata proposta la seconda implementazione preliminare dell'API Class-File per l'analisi, la generazione e la trasformazione dei file con classi Java. ClassFile cf = ClassFile.of(); ClassModel classModel = cf.parse(bytes); byte[] newBytes = cf.build(classModel.thisClass().asSymbol(), classBuilder -> { for (ClassElement ce : classModel) { if (!(ce instanceof MethodModel mm && mm.methodName().stringValue().startsWith("debug"))) { classBuilder.with(ce); } } });
- È stata proposta l'ottava implementazione preliminare dell'API Vector, che fornisce funzioni per calcoli vettoriali eseguiti utilizzando istruzioni vettoriali dei processori x86_64 e AArch64, consentendo di applicare contemporaneamente operazioni a più valori (SIMD). A differenza delle capacità di auto-vettorizzazione delle operazioni scalari fornite dal compilatore JIT HotSpot, la nuova API consente di gestire esplicitamente la vettorizzazione per l'elaborazione parallela dei dati.
- Nella classe java.io.Console sono stati aggiunti i metodi format, printf, readPassword e readLine per formattare, stampare e leggere testo tenendo conto della locale selezionata. System.console().printf(Locale.FRANCE, "%1$tY-%1$tB-%1$te %1$tA", new Date()) 2024-mai-16 jeudi
- È stata aggiunta la seconda implementazione preliminare dell'API Stream avanzato, che supporta la definizione di operazioni intermedie personalizzate, utili in situazioni in cui le operazioni intermedie incorporate esistenti non sono sufficienti per la trasformazione dei dati desiderata. I gestori personalizzati vengono collegati tramite la nuova operazione intermedia Stream::gather(Gatherer), che elabora gli elementi dello stream applicando un gestore fornito dall'utente. jshell> Stream.of(1,2,3,4,5,6,7,8,9).gather(new WindowFixed(3)).toList() $1 == > [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
- È stata aggiunta la terza implementazione preliminare delle classi implicitamente dichiarate e delle istanze anonime del metodo "main", in cui è possibile fare a meno delle dichiarazioni public/static, del passaggio di un array di argomenti e di altre entità legate alla dichiarazione di classi. // prima public class HelloWorld { public static void main(String[] args) { System.out.println("Hello world!"); } } // adesso si può void main() { System.out.println("Hello, World!"); }
- È stata aggiunta una seconda opzione preliminare che consente di specificare nelle espressioni dei costruttori prima della chiamata a super(...), utilizzata per invocare esplicitamente il costruttore della classe genitore dal costruttore della classe derivata, se queste espressioni non fanno riferimento all'istanza creata dal costruttore. class Outer { void hello() { System.out.println("Hello"); } class Inner { Inner() { hello(); super(); } } }
- È stata aggiunta una terza implementazione preliminare dei valori limitati (Scoped Values), che consente di condividere dati immutabili tra thread e scambiare efficientemente dati tra thread figli (i valori sono ereditati). Gli Scoped Values si evolvono per sostituire il meccanismo delle variabili locali al thread (thread-local variables) e sono più efficienti quando si utilizzano un numero molto elevato di thread virtuali (migliaia e milioni di thread). La principale differenza tra gli Scoped Values e le variabili locali al thread è che i primi vengono scritti una sola volta, non possono essere cambiati in seguito e rimangono disponibili solo durante l'esecuzione del thread.
- Proposto per il test una terza versione preliminare dell'API per la concorrenza strutturata, che semplifica lo sviluppo di applicazioni multi-thread elaborando più attività eseguite in thread diversi come un unico blocco.
- Dichiarati obsoleti e previsti per la rimozione i metodi di accesso alla memoria esterna (fuori dalla JVM) forniti dalla classe sun.misc.Unsafe. Si consiglia di utilizzare l'API VarHandle e l'API FFM (Foreign Function & Memory) per accedere alla memoria off-heap e interagire con codice esterno.
Inoltre, si segnala la pubblicazione dell'aggiornamento della piattaforma per la creazione di applicazioni con interfaccia grafica JavaFX 23 e l'inclusione nel pacchetto principale dell'Oracle JDK 23 del compilatore JIT GraalVM.
È stato presentato anche un nuovo rilascio della macchina virtuale universale GraalVM, che supporta l'esecuzione di applicazioni in JavaScript (Node.js), Python, Ruby, R, tutti i linguaggi per JVM (Java, Scala, Clojure, Kotlin) e i linguaggi per i quali può essere generato il bitcode LLVM (C, C++, Rust). Oltre al supporto per JDK 23, la nuova versione ha ottimizzato il consumo di memoria e le dimensioni del codice eseguibile, realizzando un supporto completo per gli strumenti di integrazione di Python e WebAssembly nel codice Java utilizzando la compilazione JIT.
Fonte: opennet.ru

