Dopo sei mesi di sviluppo, Oracle ha pubblicato la piattaforma Java SE 23 (Java Platform, Standard Edition 23), utilizzando il progetto open-source OpenJDK come implementazione di riferimento. A parte la rimozione di alcune funzionalità obsolete, Java SE 23 mantiene la compatibilità retroattiva con le versioni precedenti della piattaforma Java: la maggior parte dei progetti Java precedentemente scritti funzionerà senza modifiche sotto la nuova versione. I pacchetti di installazione per Java SE 22 (JDK, JRE e Server JRE) sono disponibili per Linux (x86_64, AArch64), Windows (x86_64) e macOS (x86_64, AArch64). L'implementazione di riferimento di Java 23, sviluppata nell'ambito del progetto OpenJDK, è completamente open-source sotto la licenza GPLv2 con eccezioni GNU ClassPath, che consentono il collegamento dinamico con prodotti commerciali.
Java SE 23 è classificato come versione con un normale ciclo di supporto, con aggiornamenti rilasciati fino al prossimo rilascio. Le versioni con supporto a lungo termine (LTS) da utilizzare sono 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 Java SE 11 sarà supportato fino al 2032.
Tra le novità presentate in Java SE 23:
- Il generatore di spazzatura ZGC (Generational Z Garbage Collector) è attivato di default, utilizzando un'elaborazione separata per gli oggetti "vecchi" e "giovani", il che migliora l'efficienza della pulizia degli oggetti recentemente creati con un breve ciclo di vita. L'uso del Generational ZGC riduce i rischi di pause durante l'allocazione delle risorse, abbassando il carico sulla CPU e il consumo di memoria durante la raccolta della spazzatura. I test del Generational ZGC con Apache Cassandra 4 hanno mostrato un aumento della capacità di elaborazione di 4 volte con una dimensione della heap fissa e una riduzione della dimensione della heap di un quarto mantenendo inalterata la capacità di elaborazione.
- JavaDoc ha aggiunto il supporto per l'uso del markup Markdown per documentare il codice nei commenti, che può essere utilizzato al posto di una combinazione di HTML e tag @ di JavaDoc.

- I meccanismi di confronto con il modello sono stati ampliati per supportare in anticipo l'uso di tipi primitivi (int, byte, char e altri tipi di base che non sono oggetti) 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 -> «status sconosciuto: » + i; } if (i instanceof byte b) { … b … }
- È stata aggiunta la supporto preliminare per l'uso di un'unica espressione «import module M» per importare immediatamente tutti i pacchetti esportati dal modulo specificato. Questa modifica semplifica notevolmente il riutilizzo delle librerie modulari, consentendo di collegare librerie e classi senza dover definire la loro posizione nella gerarchia dei pacchetti. Ad esempio, specificare «import module java.base» importerà tutti e 54 i pacchetti che fanno parte del modulo java.base, che in precedenza sarebbero dovuti essere menzionati separatamente («import java.io.*», «import java.util.*» e simili).
È stata proposta una seconda implementazione preliminare dell'API Class-File per l'analisi, la generazione e la trasformazione dei file delle 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 un'ottava implementazione preliminare dell'API Vector, che fornisce funzioni per calcoli vettoriali eseguiti utilizzando istruzioni vettoriali delle CPU x86_64 e AArch64, consentendo di applicare operazioni contemporaneamente a più valori (SIMD). A differenza delle capacità di auto-vettorializzazione delle operazioni scalari offerte dal compilatore JIT HotSpot, la nuova API consente di gestire esplicitamente la vettorizzazione per l'elaborazione parallela dei dati.
- Sono stati aggiunti al classe java.io.Console 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 giovedì
- È stata aggiunta la seconda realizzazione preliminare dell'API Stream estesa, che supporta la definizione di operazioni intermedie personalizzate, che possono risultare utili nel caso in cui le operazioni intermedie incorporate esistenti non siano sufficienti per la trasformazione dei dati desiderata. Gli handler personalizzati vengono collegati tramite la nuova operazione intermedia Stream::gather(Gatherer), che elabora gli elementi dello stream applicando a essi l'handler 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 realizzazione preliminare delle classi implicitamente dichiarate e delle istanze non denominate del metodo «main», in cui si può fare a meno delle dichiarazioni public/static, della trasmissione di array di argomenti e di altre entità legate alla dichiarazione della classe. // era public class HelloWorld { public static void main(String[] args) { System.out.println(«Hello world!»); } } // ora si può void main() { System.out.println(«Hello, World!»); }
- È stata aggiunta la seconda variante preliminare che consente di specificare nelle classi costruttrici espressioni prima della chiamata a super(…), utilizzata per chiamare esplicitamente il costruttore della classe madre dal costruttore della classe ereditata, 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 la terza realizzazione preliminare dei valori limitati (Scoped Values), che consentono la condivisione di dati immutabili nei thread e uno scambio efficiente di dati tra thread secondari (i valori vengono ereditati). I Scoped Values sono sviluppati per sostituire il meccanismo delle variabili locali al thread (thread-local variables) e sono più efficienti nell'uso di un numero molto elevato di thread virtuali (migliaia e milioni di thread). La principale differenza tra Scoped Values e variabili locali al thread è che i primi vengono scritti una sola volta, non possono essere modificati e restano accessibili solo durante l'esecuzione del thread.
- Proposto per il test un terzo pre-release dell'API per la concorrenza strutturata (Structured Concurrency), che semplifica lo sviluppo di applicazioni multi-thread tramite la gestione di più attività eseguite in thread differenti come un unico blocco.
- Sono stati dichiarati obsoleti e previsti per la rimozione i metodi di accesso alla memoria esterna (fuori dalla JVM) forniti dalla classe sun.misc.Unsafe. Per accedere alla memoria al di fuori del heap e interagire con codice esterno, si consiglia di utilizzare le API VarHandle e FFM (Foreign Function & Memory).
In aggiunta, si segnala la pubblicazione di un aggiornamento della piattaforma per la creazione di applicazioni con interfaccia grafica JavaFX 23 e l'inclusione nel core dell'Oracle JDK 23 del compilatore JIT GraalVM.
È stata anche presentata una nuova versione della GraalVM, una macchina virtuale universale che supporta l'esecuzione di applicazioni in JavaScript (Node.js), Python, Ruby, R, qualsiasi linguaggio per JVM (Java, Scala, Clojure, Kotlin) e i linguaggi per i quali è possibile generare bitcode LLVM (C, C++, Rust). Oltre al supporto per JDK 23, nella nuova versione è stata ottimizzata l'allocazione della memoria e la dimensione del codice eseguibile, implementando un supporto completo per gli strumenti di integrazione di Python e WebAssembly nel codice Java utilizzando la compilazione JIT.
Fonte: opennet.ru

