Dopo sei mesi di sviluppo, Oracle ha rilasciato la piattaforma Java SE 18 (Java Platform, Standard Edition 18), della quale viene utilizzato come implementazione di riferimento il progetto open source OpenJDK. Ad eccezione della rimozione di alcune funzionalità obsolete, Java SE 18 mantiene la retrocompatibilità con le versioni precedenti della piattaforma Java: la maggior parte dei progetti Java precedentemente scritti funzionerà senza modifiche quando eseguiti sulla nuova versione. Le build pronte per l'installazione di Java SE 18 (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 18, sviluppata nell'ambito del progetto OpenJDK, è completamente open source sotto la licenza GPLv2 con le eccezioni di GNU ClassPath, che consentono il collegamento dinamico con prodotti commerciali.
Java SE 18 è classificato come una release con normale ciclo di supporto, gli aggiornamenti per la quale saranno rilasciati fino al prossimo rilascio. Java SE 17 deve essere utilizzato come versione a lungo termine (LTS), con aggiornamenti previsti fino al 2029. Ricordiamo che a partire dal rilascio di Java 10 il progetto ha cambiato processo di sviluppo, con un ciclo di produzione di nuove release più breve. La nuova funzionalità ora è sviluppata in un'unica branch master sempre aggiornata, dalla quale vengono create branch per la stabilizzazione delle nuove release ogni sei mesi.
Tra le novità di Java 18 si possono segnalare:
- Per impostazione predefinita è utilizzata la codifica UTF-8. Le API Java che gestiscono i dati testuali in base alla codifica dei caratteri utilizzeranno ora UTF-8 come impostazione predefinita su tutte le piattaforme, indipendentemente dalle impostazioni di sistema e dalla locale configurata. Per ripristinare il comportamento precedente, in cui la codifica viene selezionata in base alla locale di sistema, si può utilizzare il parametro "-Dfile.encoding=COMPAT".
- Il pacchetto com.sun.net.httpserver è incluso, contenente l'utilità jwebserver e un'API di libreria con un'implementazione di un semplice server http per la consegna di contenuti statici (non sono supportati gestori di tipo CGI e servlet). Il server http integrato non è ottimizzato per i carichi di lavoro e non supporta la gestione degli accessi e l'autenticazione, essendo progettato principalmente per l'uso nel processo di sviluppo per la creazione di prototipi, debugging e testing dei progetti.
- JavaDoc ha implementato il supporto per il tag «@snippet» per l'inserimento di esempi di lavoro e frammenti di codice nella documentazione API, ai quali è possibile applicare strumenti per verificare la correttezza, il highlighting della sintassi e l'integrazione con IDE.
- È stata ripensata l'implementazione dell'API java.lang.reflect (Core Reflection), progettata per ottenere informazioni su metodi, campi e costruttori delle classi, nonché per accedere alla struttura interna delle classi. L'API java.lang.reflect rimane invariata, ma ora è implementata tramite l'uso di descrittori di metodi (method handles), forniti dal modulo java.lang.invoke, invece di utilizzare generatori di bytecode. Questa modifica ha consentito di unificare le implementazioni di java.lang.reflect e java.lang.invoke, semplificando la loro manutenzione.
- È stata proposta una terza implementazione preliminare dell'API Vector, che fornisce funzionalità per calcoli vettoriali eseguiti utilizzando le istruzioni vettoriali dei processori x86_64 e AArch64, consentendo di applicare operazioni simultaneamente 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.
- È stato aggiunto un'interfaccia SPI (service-provider interface) per la risoluzione dei nomi host e indirizzi IP, che consente di utilizzare in java.net.InetAddress resolvitori alternativi, non legati ai gestori forniti dal sistema operativo.
- È stata proposta la seconda implementazione preliminare dell'API Foreign Function & Memory, che consente alle applicazioni di interagire con codice e dati al di fuori del runtime Java. Il nuovo API permette di chiamare in modo efficace funzioni che vengono eseguite al di fuori della JVM e di accedere a memoria non gestita dalla JVM. Ad esempio, è possibile chiamare funzioni da librerie condivise esterne e accedere ai dati dei processi senza utilizzare JNI.
- È stata aggiunta la seconda implementazione sperimentale del pattern matching nelle espressioni «switch», che permette di utilizzare modelli flessibili nei case invece di valori esatti, coprendo così una serie di valori per cui in precedenza era necessario utilizzare catene ingombranti di espressioni «if…else». Object o = 123L; String formatted = switch (o) { case Integer i -> String.format("int %d", i); case Long l -> String.format("long %d", l); case Double d -> String.format("double %f", d); case String s -> String.format("String %s", s); default -> o.toString(); };
- È stata dichiarata obsoleta e verrà disabilitata in una delle prossime versioni la meccanica di finalizzazione, insieme ai metodi correlati, come Object.finalize(), Enum.finalize(), Runtime.runFinalization() e System.runFinalization().
- Nei garbage collector ZGC (Z Garbage Collector), SerialGC e ParallelGC è stata implementata la supporto per la deduplicazione delle stringhe.
Fonte: opennet.ru
