Versione Java SE 17

Dopo sei mesi di sviluppo, Oracle ha rilasciato la piattaforma Java SE 17 (Java Platform, Standard Edition 17), che utilizza il progetto open source OpenJDK come implementazione di riferimento. Ad eccezione della rimozione di alcune funzionalità deprecate, Java SE 17 mantiene la retrocompatibilità con le versioni precedenti della piattaforma Java: la maggior parte dei progetti Java scritti in precedenza continuerà a funzionare senza modifiche quando viene eseguita con la nuova versione. Le build pronte per l'installazione di Java SE 17 (JDK, JRE e Server JRE) sono preparate per Linux (x86_64, AArch64), Windows (x86_64) e macOS (x86_64, AArch64). Sviluppata dal progetto OpenJDK, l'implementazione di riferimento Java 17 è completamente open source con licenza GPLv2 con eccezioni GNU ClassPath per consentire il collegamento dinamico a prodotti commerciali.

Java SE 17 è classificato come una versione LTS (Long Term Support), che continuerà a ricevere aggiornamenti fino al 2029. Gli aggiornamenti per la versione precedente della pietra miliare Java 16 sono stati interrotti. Il precedente ramo LTS di Java 11 sarà supportato fino al 2026. La prossima versione LTS è prevista per settembre 2024. Ricordiamo che a partire dal rilascio di Java 10, il progetto è passato a un nuovo processo di sviluppo, implicando un ciclo più breve per la formazione di nuove versioni. Le nuove funzionalità sono ora sviluppate in un ramo principale costantemente aggiornato, che include modifiche già pronte e da cui si diramano i rami ogni sei mesi per stabilizzare le nuove versioni.

Le nuove funzionalità di Java 17 includono:

  • Viene proposta un'implementazione sperimentale del patternmatching nelle espressioni “switch”, che consente di utilizzare non valori esatti nelle etichette “case”, ma modelli flessibili che coprono una serie di valori contemporaneamente, per i quali in precedenza era necessario utilizzare ingombranti catene di espressioni “if...else”. Inoltre, "switch" ha la capacità di gestire valori NULL. Oggetto o = 123L; Stringa formattata = 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); predefinito -> o.toString(); };
  • Supporto stabilizzato per classi e interfacce sigillate, che non possono essere utilizzate da altre classi e interfacce per ereditare, estendere o sovrascrivere l'implementazione. Le classi sigillate forniscono anche un modo più dichiarativo per limitare l'uso di una superclasse rispetto ai modificatori di accesso, basato sull'elenco esplicito delle sottoclassi consentite per l'estensione. pacchetto com.example.geometry; la classe pubblica sigillata Shape consente com.example.polar.Circle, com.example.quad.Rectangle, com.example.quad.simple.Square {…}
  • Viene proposta una seconda anteprima della Vector API, che fornisce funzioni per calcoli vettoriali che vengono eseguiti utilizzando istruzioni vettoriali su 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.
  • Aggiunta un'anteprima dell'API Foreign Function & Memory, che consente alle applicazioni di interagire con codice e dati al di fuori del runtime Java. La nuova API consente di chiamare in modo efficiente funzioni non JVM e accedere alla memoria non gestita da JVM. Ad esempio, è possibile chiamare funzioni da librerie condivise esterne e accedere ai dati di processo senza utilizzare JNI.
  • Il motore di rendering di macOS che alimenta l'API Java 2D, che a sua volta alimenta l'API Swing, è stato adattato per utilizzare l'API grafica Metal. La piattaforma macOS continua a utilizzare OpenGL per impostazione predefinita e l'abilitazione del supporto Metal richiede l'impostazione "-Dsun.java2d.metal=true" e l'esecuzione almeno di macOS 10.14.x.
  • Aggiunto un port per la piattaforma macOS/AArch64 (computer Apple basati sui nuovi chip Apple M1). Una caratteristica speciale del port è il supporto per il meccanismo di protezione della memoria W^X (Write XOR Execute), in cui non è possibile accedere contemporaneamente alle pagine di memoria per la scrittura e l'esecuzione. (il codice può essere eseguito solo dopo che la scrittura è disabilitata e la scrittura su una pagina di memoria è possibile solo dopo che l'esecuzione è disabilitata).
  • Ripristinato l'utilizzo solo della semantica strictfp per le espressioni in virgola mobile. Il supporto per la semantica "predefinita", disponibile dal rilascio di Java 1.2, è stato interrotto, comprese le semplificazioni per lavorare su sistemi con coprocessori matematici x87 molto vecchi (dopo l'avvento delle istruzioni SSE2, la necessità di semantica aggiuntiva è scomparsa).
  • Sono stati implementati nuovi tipi di interfacce per generatori di numeri pseudocasuali e sono stati implementati algoritmi aggiuntivi per una migliore generazione di numeri casuali. Alle applicazioni viene data la possibilità di scegliere un algoritmo per generare numeri pseudocasuali. Supporto migliorato per la generazione di flussi di oggetti casuali.
  • Incapsulamento rigoroso applicato a tutti i componenti interni di JDK, ad eccezione delle API critiche come sun.misc.Unsafe. L'incapsulamento rigoroso blocca i tentativi da parte del codice di accedere a classi, metodi e campi interni. In precedenza, la modalità di incapsulamento rigoroso poteva essere disabilitata utilizzando l'opzione "--illegal-access=permit", ma ora è stata deprecata. Le applicazioni che richiedono l'accesso a classi, metodi e campi interni devono definirli esplicitamente utilizzando l'opzione --add-opens o l'attributo Add-Opens nel file manifest.
  • Alle applicazioni viene data la possibilità di definire filtri di deserializzazione dei dati, che possono essere sensibili al contesto e selezionati dinamicamente in base a specifiche operazioni di deserializzazione. I filtri specificati sono applicabili all'intera macchina virtuale (a livello di JVM), ad es. coprono non solo l'applicazione stessa, ma anche le librerie di terze parti utilizzate nell'applicazione.
  • Swing ha aggiunto il metodo javax.swing.filechooser.FileSystemView.getSystemIcon per caricare icone di grandi dimensioni per migliorare l'interfaccia utente sugli schermi ad alto DPI.
  • L'API java.net.DatagramSocket fornisce il supporto per la connessione ai gruppi multicast senza la necessità di un'API java.net.MulticastSocket separata.
  • L'utilità IGV (Ideal Graph Visualizer) è stata migliorata, fornendo una visualizzazione interattiva della rappresentazione del codice intermedio nel compilatore JIT HotSpot VM C2.
  • In JavaDoc, per analogia con il compilatore Javac, quando viene emesso un errore, ora vengono indicati il ​​numero della riga problematica nel file sorgente e la posizione dell'errore.
  • 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 la manipolazione dell'ora senza riferimento a un fuso orario.
  • Aggiunta API java.util.HexFormat per la conversione in rappresentazione esadecimale e viceversa.
  • Al compilatore è stata aggiunta una modalità blackhole, che disabilita le operazioni di eliminazione del codice morto, che possono essere utilizzate durante l'esecuzione di test delle prestazioni.
  • Aggiunta l'opzione "-Xlog:async" al runtime per registrare i log in modalità asincrona.
  • Quando si stabiliscono connessioni sicure, TLS 1.3 è abilitato per impostazione predefinita (in precedenza veniva utilizzato TLS 1.2).
  • L'API Applet precedentemente dichiarata obsoleta (java.applet.Applet*, javax.swing.JApplet), utilizzata per eseguire applicazioni Java nel browser, è stata spostata nella categoria di cui è prevista la rimozione (persa rilevanza dopo la fine del supporto per il plugin Java per i browser).
  • Security Manager, che da tempo ha perso la sua rilevanza e si è rivelato non reclamato dopo la fine del supporto per il plug-in del browser, è stato spostato nella categoria di quelli di cui è prevista la rimozione.
  • È stato rimosso il meccanismo di attivazione RMI, che è obsoleto, relegato alla categoria di un'opzione in Java 8 e non viene quasi mai utilizzato nella pratica moderna.
  • Un compilatore sperimentale che supporta JIT (just-in-time) per la compilazione dinamica del codice Java per HotSpot JVM, nonché la modalità di compilazione anticipata (AOT, ahead-of-time) delle classi nel codice macchina prima di avviare la macchina virtuale , è stato rimosso dall'SDK. Il compilatore è stato scritto in Java e basato sul lavoro del progetto Graal. Va notato che la manutenzione del compilatore richiede molto lavoro, il che non è giustificato quando non c'è richiesta da parte degli sviluppatori.

Fonte: opennet.ru

Aggiungi un commento