Rilascio di Java SE 17

Dopo sei mesi di sviluppo, Oracle ha rilasciato la piattaforma Java SE 17 (Java Platform, Standard Edition 17), utilizzando il progetto OpenJDK come implementazione di riferimento. A parte la rimozione di alcune funzionalità obsolete, Java SE 17 mantiene la compatibilità retroattiva con le versioni precedenti della piattaforma Java: la maggior parte dei progetti Java precedentemente scritti funzionerà senza modifiche con la nuova versione. Le build pronte per l'installazione di Java SE 17 (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 17, 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 17 è classificato tra le versioni con supporto a lungo termine (LTS), gli aggiornamenti per il quale saranno rilasciati fino al 2029. Il rilascio di aggiornamenti per la precedente versione intermedia Java 16 è terminato. La precedente versione LTS Java 11 sarà supportata fino al 2026. Il prossimo rilascio LTS è previsto per settembre 2024. Ricordiamo che a partire dalla versione Java 10 il progetto è passato a un nuovo processo di sviluppo, che prevede un ciclo di rilascio più breve. Le nuove funzionalità ora si sviluppano in un master branch sempre aggiornato, in cui vengono incluse le modifiche già pronte e dal quale vengono ramificate le versioni per la stabilizzazione ogni sei mesi.

Tra le novità di Java 17 si possono notare:

  • È stata proposta un'implementazione sperimentale della corrispondenza dei modelli nelle espressioni «switch», consentendo di utilizzare nei casi «case» non solo valori specifici, ma modelli flessibili che coprono una serie di valori, per i quali in precedenza era necessario utilizzare ingombranti catene di espressioni «if…else». Inoltre, all'interno dello «switch» è garantita la possibilità di gestire valori NULL. 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 stabilizzata la supporto per classi e interfacce sigillate («sealed»), che non possono essere utilizzate da altre classi e interfacce per ereditare, estendere o sovrascrivere implementazioni. Le classi sigillate forniscono anche un modo più dichiarativo di limitare l'utilizzo di una superclasse rispetto ai modificatori di accesso, basato su un'esplicita enumerazione delle sottoclassi autorizzate all'estensione. package com.example.geometry; public sealed class Shape permits com.example.polar.Circle, com.example.quad.Rectangle, com.example.quad.simple.Square {…}
  • È stata proposta la seconda implementazione preliminare dell'API Vector, che fornisce funzionalità per calcoli vettoriali effettuati utilizzando le istruzioni vettoriali dei processori x86_64 e AArch64 e consente di applicare simultaneamente operazioni a più valori (SIMD). A differenza delle capacità di autovettorizzazione delle operazioni scalari fornite dal compilatore JIT HotSpot, la nuova API offre la possibilità di gestire esplicitamente la vettorizzazione per l’elaborazione parallela dei dati.
  • È stata aggiunta un'implementazione preliminare dell'API Foreign Function & Memory, tramite la quale le applicazioni possono interagire con codice e dati al di fuori del runtime Java. La nuova API consente di chiamare in modo efficace funzioni eseguite al di fuori della JVM e di accedere alla memoria non gestita dalla JVM. Ad esempio, è possibile richiamare funzioni da librerie condivise esterne e accedere ai dati di un processo senza utilizzare JNI.
  • Un motore grafico per macOS che supporta le API Java 2D, utilizzato a sua volta nell'API Swing, adattato per l'API grafica Metal. Per impostazione predefinita, sulla piattaforma macOS viene ancora utilizzato OpenGL, mentre per abilitare il supporto a Metal è necessario impostare l'opzione "-Dsun.java2d.metal=true" e avere almeno la versione 10.14.x di macOS.
  • È stata aggiunta una versione per la piattaforma macOS/AArch64 (computer Apple basati sui nuovi chip Apple M1). La caratteristica di questa versione è il supporto per il meccanismo di protezione della memoria W^X (Write XOR Execute), secondo il quale le pagine della memoria non possono essere accessibili contemporaneamente per la scrittura e l'esecuzione. (Il codice può essere eseguito solo dopo che la scrittura è stata vietata e la scrittura in una pagina di memoria è possibile solo dopo che l'esecuzione è stata vietata).
  • È stato ripristinato l'uso della semantica solo stretta (strictfp) per le espressioni in virgola mobile. È stata interrotta la supporto della semantica "default" disponibile fin dalla release di Java 1.2, che includeva semplificazioni per l'utilizzo su sistemi con co-processori matematici x87 molto vecchi (dopo l'introduzione delle istruzioni SSE2, l'esigenza di semantiche aggiuntive è scomparsa).
  • Sono stati implementati nuovi tipi di interfacce per i generatori di numeri pseudo-casuali, insieme ad algoritmi aggiuntivi per una generazione di numeri casuali di qualità superiore. Le applicazioni possono ora scegliere l'algoritmo di generazione dei numeri pseudo-casuali. È stato migliorato il supporto per la generazione di flussi di oggetti casuali.
  • È stata introdotta una rigorosa incapsulazione obbligatoria di tutti gli elementi interni del JDK, ad eccezione delle API critiche, come sun.misc.Unsafe. L'incapsulazione rigorosa blocca i tentativi di accesso al codice di classi, metodi e campi interni. In precedenza, la modalità di incapsulazione rigorosa poteva essere disattivata tramite l'opzione «—illegal-access=permit», ma ora è obsoleta. Per le applicazioni che necessitano di accesso a classi, metodi e campi interni, è necessario specificarli esplicitamente utilizzando l'opzione «—add-opens» o l'attributo Add-Opens nel file del manifesto.
  • Le applicazioni possono definire filtri per la deserializzazione dei dati, che possono dipendere dal contesto e essere scelti dinamicamente in relazione a determinate operazioni di deserializzazione. I filtri specificati si applicano a tutti macchina virtuale (JVM-wide), ovvero coprono non solo l'applicazione stessa, ma anche le librerie di terze parti utilizzate nell'applicazione.
  • In Swing è stato aggiunto il metodo javax.swing.filechooser.FileSystemView.getSystemIcon per caricare icone di grandi dimensioni, migliorando così la creazione dell'interfaccia su schermi ad alta densità di pixel (HighDPI).
  • Nell'API java.net.DatagramSocket è stato implementato il supporto per la connessione a gruppi Multicast senza la necessità di usare l'API separata java.net.MulticastSocket.
  • È stata migliorata l'utilità IGV (Ideal Graph Visualizer), che fornisce una visualizzazione interattiva della rappresentazione intermedia del codice nel compilatore JIT HotSpot VM C2.
  • Nella JavaDoc, analogamente al compilatore javac, ora viene indicato il numero della riga problematica nel file sorgente e la posizione dell'errore durante la segnalazione di errori.
  • È stata aggiunta la proprietà native.encoding, che riflette il nome della codifica dei caratteri del sistema (UTF-8, koi8-r, cp1251, ecc.).
  • È stata aggiunta l'interfaccia java.time.InstantSource, che consente di manipolare il tempo senza legarsi a un fuso orario.
  • È stata aggiunta l'API java.util.HexFormat per la conversione nella rappresentazione esadecimale e viceversa.
  • Nel compilatore è stata aggiunta la modalità blackhole, che disabilita le operazioni di eliminazione del codice non utilizzato (dead-code elimination), utile per effettuare test sulle prestazioni.
  • Nel Runtime è stata aggiunta l'opzione «-Xlog:async» per la registrazione dei log in modalità asincrona.
  • Per le connessioni protette è stato attivato di default TLS 1.3 (in precedenza era utilizzato TLS 1.2).
  • È stato spostato nella categoria delle funzionalità previste per la rimozione il già deprecato API Applet (java.applet.Applet*, javax.swing.JApplet), utilizzato per eseguire applicazioni Java nel browser (non più rilevante dopo la cessazione del supporto per il plugin Java nei browser).
  • È stato spostato nella categoria delle funzionalità previste per la rimozione il Security Manager, da tempo obsoleto e non richiesto dopo la cessazione del supporto per il plugin del browser.
  • È stato rimosso il meccanismo RMI Activation, obsoleto, spostato in opzione già dalla Java 8 e quasi non utilizzato nella pratica moderna.
  • Nel SDK è stato rimosso il compilatore sperimentale che supporta JIT (just-in-time) per la compilazione dinamica del codice Java per HotSpot JVM, così come la modalità di compilazione anticipata (AOT, ahead-of-time) delle classi in codice macchina prima dell'avvio della macchina virtuale. Il compilatore era scritto in Java e basato sul lavoro del progetto Graal. Si osserva che il supporto per il compilatore richiede un notevole dispendio di risorse, che non è giustificato data la scarsa richiesta da parte degli sviluppatori.

Fonte: opennet.ru

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster