Dopo sei mesi di sviluppo, Oracle ha rilasciato Java SE 23 (Java Platform, Standard Edition 23), che utilizza il progetto open source OpenJDK come implementazione di riferimento. Ad eccezione della rimozione di alcune funzionalità deprecate, Java SE 23 mantiene la compatibilità con le versioni precedenti della piattaforma Java: la maggior parte dei progetti Java scritti in precedenza funzioneranno senza modifiche quando eseguiti con la nuova versione. Sono disponibili build pronte per l'installazione di Java SE 22 (JDK, JRE e Server JRE). Linux (x86_64, AArch64), Windows (x86_64) e macOS (x86_64, AArch64). Sviluppata dal progetto OpenJDK, l'implementazione di riferimento di Java 23 è completamente open source sotto licenza GPLv2 con l'eccezione GNU ClassPath, che consente il collegamento dinamico con prodotti commerciali.
Java SE 23 è classificato come una versione di supporto regolare e continuerà a ricevere aggiornamenti fino alla versione successiva. Il ramo Long Term Support (LTS) dovrebbe essere Java SE 21 o Java SE 17, che riceveranno aggiornamenti rispettivamente fino al 2031 e al 2029 (generalmente disponibili fino al 2028 e 2026). Il supporto esteso per il ramo LTS di Java SE 8 durerà fino al 2030 e Java SE 11 fino al 2032.
Tra le 23 novità proposte in Java SE:
- La modalità operativa generativa del garbage collector ZGC (Generation Z Garbage Collector) è abilitata per impostazione predefinita, utilizzando l'elaborazione separata di oggetti "vecchi" e "giovani", che aumenta l'efficienza della pulizia degli oggetti creati di recente con una durata breve. L'utilizzo di Generational ZGC riduce il rischio di stallo durante l'allocazione delle risorse, riduce il carico della CPU e il consumo di memoria durante la garbage collection. Il test di ZGC generazionale con Apache Cassandra 4 ha mostrato un aumento di 4 volte del throughput con una dimensione heap fissa e una riduzione di un quarto della dimensione heap con throughput costante.
- JavaDoc ha aggiunto il supporto per l'utilizzo di Markdown per documentare il codice nei commenti, che può essere utilizzato al posto di una combinazione di tag HTML e JavaDoc @.

- I meccanismi di corrispondenza dei modelli sono stati migliorati 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'istruzione "instanceof" e nei blocchi "switch". switch (x.getStatus()) { case 0 -> “okay”; caso 1 -> “avviso”; caso 2 -> “errore”; case int i -> “stato sconosciuto:” + i; } if (i istanza del byte b) { … b … }
- Aggiunto supporto preliminare per l'utilizzo di una singola istruzione "import module M" per importare contemporaneamente tutti i pacchetti esportati da un modulo specificato. La modifica semplifica notevolmente il riutilizzo delle librerie modulari, consentendo di includere librerie e classi senza determinare la loro posizione nella gerarchia dei pacchetti. Ad esempio, specificando "import module java.base" verranno importati tutti i 54 pacchetti inclusi nel modulo java.base, che in precedenza avrebbe dovuto essere menzionato separatamente ("import java.io.*", "import java.util.* " ecc.).
Viene proposta una seconda implementazione preliminare dell'API Class-File per analizzare, generare e convertire file di classi Java. ClassFile cf = ClassFile.of(); ClassModel classModel = cf.parse(byte); byte[] newBytes = cf.build(classModel.thisClass().asSymbol(), classBuilder -> { for (ClassElement ce : classModel) { if (!(ce istanza di MethodModel mm && mm.methodName().stringValue(). iniziaCon("debug"))) { classBuilder.with(ce);
- L'ottava anteprima della Vector API fornisce funzioni per calcoli vettoriali che vengono eseguiti utilizzando istruzioni vettoriali sui processori x86_64 e AArch64 e consentono di applicare operazioni contemporaneamente a più valori (SIMD). A differenza delle funzionalità fornite nel compilatore JIT HotSpot per la vettorizzazione automatica delle operazioni scalari, la nuova API consente di controllare esplicitamente la vettorizzazione per l'elaborazione parallela dei dati.
- Aggiunti metodi format, printf, readPassword e readLine alla classe java.io.Console per formattare, visualizzare e leggere il testo in base alla locale selezionata. System.console().printf(Locale.FRANCE, "%1$tY-%1$tB-%1$te %1$tA", new Date()) 2024-mai-16 giovedi
- È stata aggiunta una seconda implementazione di anteprima dell'API Stream estesa che supporta la definizione delle proprie operazioni intermedie, che può essere utile nei casi in cui le operazioni intermedie integrate esistenti non sono sufficienti per la trasformazione dei dati desiderata. I gestori nativi vengono connessi utilizzando la nuova operazione intermedia Stream::gather(Gatherer), che elabora gli elementi del flusso applicando loro un gestore specificato 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]]
- Aggiunta una terza implementazione preliminare di classi dichiarate implicitamente e istanze senza nome del metodo "main", che può fare a meno di dichiarazioni pubbliche/statiche, passando un array di argomenti e altre entità associate a una dichiarazione di classe. // era la classe pubblica HelloWorld { public static void main(String[] args) { System.out.println("Hello world!"); } } // ora puoi annullare main() { System.out.println("Hello, World!"); }
- Aggiunta una seconda anteprima di una funzionalità che consente ai costruttori di specificare le espressioni prima di chiamare super(...), utilizzata per chiamare esplicitamente il costruttore di una classe genitore dal costruttore di una classe ereditata se tali espressioni non si riferiscono a un'istanza creata dal costruttore. class Esterno { void ciao() { System.out.println("Ciao"); } class Interna { Interna() { ciao(); super(); } } }
- Aggiunta una terza implementazione di anteprima dei valori con ambito, che consente la condivisione di dati immutabili tra thread e lo scambio efficiente di dati tra thread secondari (i valori vengono ereditati). Gli Scoped Values sono in fase di sviluppo per sostituire il meccanismo delle variabili locali del thread e sono più efficienti quando si utilizzano numeri molto grandi di thread virtuali (migliaia o milioni di thread). La differenza principale tra gli Scoped Values e le variabili thread-local è che i primi vengono scritti una volta, non possono essere modificati in futuro e rimangono disponibili solo per la durata dell’esecuzione del thread.
- Una terza anteprima dell'API Structured Concurrency è stata proposta per il test, semplificando lo sviluppo di applicazioni multi-thread elaborando più attività in esecuzione in thread diversi come un unico blocco.
- I metodi di accesso alla memoria esterna (all'esterno della JVM) forniti dalla classe sun.misc.Unsafe sono stati deprecati e ne è stata programmata la rimozione. Per accedere alla memoria off-heap e interagire con il codice esterno, si consiglia di utilizzare l'API VarHandle e l'API FFM (Foreign Function & Memory).
Inoltre, segnaliamo la pubblicazione di un aggiornamento della piattaforma per la creazione di applicazioni con l'interfaccia grafica JavaFX 23 e l'inclusione del compilatore JIT GraalVM nel principale Oracle JDK 23.
Viene inoltre presentata una nuova versione della macchina virtuale universale GraalVM, che supporta l'esecuzione di applicazioni in JavaScript (Node.js), Python, Ruby, R, qualsiasi linguaggio per JVM (Java, Scala, Clojure, Kotlin) e linguaggi per il quale è possibile generare il codice bit LLVM (C, C++, Rust). Oltre a supportare JDK 23, la nuova versione ottimizza il consumo di memoria e la dimensione del codice eseguibile e fornisce il supporto completo per gli strumenti per incorporare Python e WebAssembly nel codice Java utilizzando la compilazione JIT.
Fonte: opennet.ru

