Dopo sei mesi di sviluppo, Oracle ha rilasciato la piattaforma Java SE 18 (Java Platform, Standard Edition 18), la cui implementazione di riferimento utilizza 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 con la nuova versione. I pacchetti pronti 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 con licenza GPLv2 e le eccezioni di GNU ClassPath, che consentono il collegamento dinamico a prodotti commerciali.
Java SE 18 è classificato come una versione con ciclo di supporto regolare, con aggiornamenti che verranno rilasciati fino alla prossima versione. Per una versione con supporto a lungo termine (LTS), si consiglia di utilizzare Java SE 17, per il quale gli aggiornamenti verranno rilasciati fino al 2029. Ricordiamo che a partire dal rilascio di Java 10, il progetto ha adottato un nuovo processo di sviluppo, che prevede un ciclo di rilascio più breve. Le nuove funzionalità ora vengono sviluppate in un branch master costantemente aggiornato, nel quale vengono integrate le modifiche già pronte e nel quale si diramano, ogni sei mesi, i branch per la stabilizzazione di nuove versioni.
Tra le novità di Java 18 si possono notare:
- La codifica UTF-8 è attivata per impostazione predefinita. Le API Java che elaborano dati testuali tenendo conto della codifica dei caratteri utilizzeranno ora UTF-8 come impostazione predefinita su tutte le piattaforme, indipendentemente dalle impostazioni di sistema e dalla localizzazione impostata. Per ripristinare il comportamento precedente, dove la codifica viene scelta in base alla localizzazione di sistema, è possibile utilizzare il parametro "-Dfile.encoding=COMPAT".
- Il pacchetto com.sun.net.httpserver è incluso, che contiene l'utilità jwebserver e un'API di libreria con l'implementazione di un semplice server http per la consegna di contenuti statici (non vengono supportati i gestori simili ai CGI e ai servlet). Il server http integrato non è ottimizzato per carichi di lavoro ed non supporta la gestione degli accessi e l'autenticazione, poiché è principalmente destinato all'uso nel processo di sviluppo per la creazione di prototipi, il debug e il testing dei progetti.
- JavaDoc implementa il supporto per il tag «@snippet» per l'integrazione di esempi di lavoro e frammenti di codice nella documentazione dell'API, a cui è possibile applicare strumenti per la verifica della correttezza, l'evidenziazione della sintassi e l'integrazione con l'IDE.
- È stata rivisitata l'implementazione dell'API java.lang.reflect (Core Reflection), destinata a ottenere informazioni sui metodi, campi e costruttori delle classi, nonché ad accedere alla struttura interna delle classi. L'API java.lang.reflect è rimasta invariata, ma ora è implementata utilizzando i descrittori dei metodi (method handles), forniti dal modulo java.lang.invoke, invece di utilizzare i generatori di bytecode. Questa modifica ha consentito di unificare le implementazioni di java.lang.reflect e java.lang.invoke e di semplificare la loro manutenzione.
- È stata proposta una terza implementazione preliminare dell'API Vector, che fornisce funzionalità per i calcoli vettoriali, eseguiti utilizzando le istruzioni vettoriali dei processori x86_64 e AArch64, permettendo di applicare operazioni simultaneamente a più valori (SIMD). A differenza delle capacità di auto-vettorizzazione delle operazioni scalari offerte dal compilatore JIT HotSpot, la nuova API consente di gestire esplicitamente la vettorizzazione per l'elaborazione parallela dei dati.
- È stata aggiunta un'interfaccia SPI (service-provider interface) per la risoluzione dei nomi degli host e IP addresses, che consente di utilizzare in java.net.InetAddress risolutori alternativi, non legati ai gestori offerti dal sistema operativo.
- È stata proposta una seconda implementazione preliminare dell'API Foreign Function & Memory, che consente alle applicazioni di interagire con codice e dati al di fuori del runtime Java. La nuova API permette di chiamare efficacemente funzioni eseguite al di fuori della JVM e accedere alla memoria non gestita dalla JVM. Ad esempio, è possibile invocare funzioni da librerie condivise esterne e accedere ai dati di un processo senza utilizzare JNI.
- È stata aggiunta una seconda implementazione sperimentale del pattern matching nelle espressioni 'switch', che consente di utilizzare in etichette 'case' non solo valori esatti, ma modelli flessibili che racchiudono una serie di valori, per i quali in precedenza era necessario utilizzare ingombranti catene 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(); };
- Il meccanismo di finalizzazione, così come i metodi associati come Object.finalize(), Enum.finalize(), Runtime.runFinalization() e System.runFinalization(), è stato dichiarato obsoleto e verrà disattivato in una delle prossime versioni.
- I garbage collector ZGC (Z Garbage Collector), SerialGC e ParallelGC implementano il supporto per la deduplicazione delle stringhe.
Fonte: opennet.ru
