Le novità Java 22
JDK 22 con Le novità Java 22 dovrebbe essere rilasciato il 19 marzo 2024. In questo post, forniamo un’anteprima di tutte le funzionalità che possiamo iniziare ad apprezzare in Java 22!
La versione precedente di Java, JDK 21 (LTS), è stata rilasciata il 19 settembre 2023 e ha introdotto 15 nuove funzionalità, tra cui modelli di record, thread virtuali, modelli di stringa (fase di anteprima) e altro ancora.
Curiosi di conoscere gli aggiornamenti e Le novità Java 22?
Leggendo a fondo il nostro post sulle Le novità Java 22 potremo essere pronti ad affrontare tutte le nuove funzionalità di JDK 21!
Java 22 prosegue su questa strada e porta con sé alcuni nuovi aggiornamenti per gli sviluppatori. Di seguito troviamo le Le novità Java 22 con descrizioni dettagliate (alcune con esempi) delle 12 nuove funzionalità di Java 22.
Cosa aspettarsi da Java 22?
Il set di funzionalità per JDK 22 è congelato, il che significa che non verranno aggiunte nuove funzionalità o JEP (JDK Enhancement Proposal). Per dare un’occhiata in anteprima, accedi alle build di accesso anticipato di JDK 22 per Linux, MacOS e Windows su https://jdk.java.net/22/ .
Ecco un elenco di tutte le funzionalità e Le novità Java 22 previste:
Estensioni e aggiornamenti del linguaggio di base che dovremmo assolutamente controllare
Java 22 prosegue sulla strada tracciata da JDK 21, con molteplici aggiornamenti del linguaggio di base.
Variabili e pattern senza nome migliorano notevolmente la chiarezza e la manutenibilità del codice. I modelli di stringa , che riceveranno la loro seconda anteprima in JDK 22, consentono agli sviluppatori di produrre risultati non stringa specializzati calcolati in fase di esecuzione.
Il supporto per le istruzioni beforesuper(…) consente maggiore flessibilità nel modo in cui si utilizzano i costruttori e fornisce un modo più naturale per la convalida, la preparazione e la condivisione degli argomenti. La nuova funzionalità stream gatherer migliora la flessibilità e l’espressività delle pipeline Stream abilitando operazioni di trasformazione dei dati intermedi personalizzati.
Con la seconda anteprima delle classi dichiarate implicitamente e dei metodi principali delle istanze , diventa più facile scrivere programmi semplici. E infine, il launcher delle applicazioni Java può ora eseguire applicazioni in più file sorgente .
- 456: Variabili e modelli senza nome
- 459: Modelli di stringa (seconda anteprima)
- 447: Dichiarazioni prima di super(…) (Anteprima)
- 461: Raccoglitori di flussi (Anteprima)
- 463: Classi dichiarate implicitamente e metodi principali dell’istanza (seconda anteprima)
- 458: Avvia programmi con codice sorgente multi-file
Estensioni al codice multithread
Il supporto del codice multithread è stato un aspetto fondamentale di Java 21 e continua a essere un’area di interesse anche in JDK 22.
Java 22 porta una seconda anteprima della concorrenza strutturata , una funzionalità che semplifica la programmazione multithread consentendo agli sviluppatori di gestire attività correlate in esecuzione in thread separati come un’unica unità di lavoro. Ciò aiuta a coordinare meglio i thread virtuali e fornisce trasparenza consentendo agli strumenti di osservabilità di visualizzare i thread in un modo che sia facile da comprendere per lo sviluppatore.
I valori con ambito riceveranno anche la loro seconda anteprima in JDK 22. Questa funzionalità consente agli sviluppatori di condividere dati immutabili tra thread senza l’uso di argomenti di metodo.
- 462: Concorrenza strutturata (seconda anteprima)
- 464: Valori con ambito (seconda anteprima)
Miglioramenti delle prestazioni e dell’infrastruttura
Naturalmente, JDK 22 apporta anche una serie di miglioramenti alle prestazioni e all’infrastruttura del linguaggio Java.
Il pinning della regione nel garbage collector (GC) G1 predefinito contribuisce a ridurre la latenza e assicura che GC non debba più essere disabilitato nelle regioni critiche JNI. La nuova API di memoria e funzione esterna (finalizzata dopo 3 anteprime nelle versioni precedenti) fornisce una migliore interoperabilità con codice e dati al di fuori del runtime Java.
Raggiungendo la sua settima fase di incubazione, Vector API aiuta a migliorare il modello di oggetti Java abilitando l’espressione di calcoli vettoriali compilati in fase di esecuzione. Una nuova funzionalità di anteprima, Class-file API , aiuta ad analizzare, generare e trasformare i class-file Java per evitare problemi di compatibilità tra le varie librerie disponibili.
- 423: Blocco regione per G1
- 454: API di memoria e funzione esterna
- 460: API vettoriale (settimo incubatore)
- 457: API Class-File (anteprima)
Funzionalità e Le novità Java 22 spiegate
423: Blocco regione per G1
L’implementazione del region pinning in G1 aiuta a ridurre la latenza e garantisce che la garbage collection non debba essere disabilitata durante le regioni critiche JNI (Java Native Interface).
Quando si sviluppa un’applicazione che richiede interoperabilità con linguaggi di programmazione non gestiti (come C e C++), JNI usa funzioni per 1) ottenere e poi 2) rilasciare puntatori diretti a oggetti Java. Queste coppie di funzioni vengono eseguite in una regione critica e non devono essere spostate durante la garbage collection. È possibile bloccarle nelle loro posizioni o semplicemente disabilitare del tutto la garbage collection finché un thread si trova in una regione critica. Quest’ultimo approccio (che usa il garbage collector predefinito G1) può essere problematico perché il garbage collector deve attendere che nessun thread si trovi in una regione critica.
Ma lo stallo dei thread è un ricordo del passato: con l’introduzione del region pinning in JDK 22, i thread Java non dovranno più attendere il completamento di un’operazione di garbage collection G1. Ciò riduce la latenza e le regressioni nella garbage collection.
447: Dichiarazioni precedenti super(…)
Questa nuova funzionalità offre maggiore flessibilità nell’uso dei costruttori, consentendo alle istruzioni che non hanno riferimenti all’istanza creata di precedere un’invocazione esplicita del costruttore.
Nel caso in cui il tuo codice includa una classe che estende un’altra classe, la sottoclasse erediterà la funzionalità della superclasse. Nuove funzionalità possono essere aggiunte dichiarando nuovi campi e metodi. Ma a causa di potenziali dipendenze, dovrai assicurarti che i campi della superclasse siano inizializzati prima dei campi della sottoclasse stessa.
Nelle versioni Java precedenti super(…)non poteva essere preceduto da altre istruzioni in un costruttore. Supportando le istruzioni prima di super(…), questa nuova funzionalità (anteprima) fornisce un modo più naturale per la convalida degli argomenti, la preparazione degli argomenti e la condivisione degli argomenti nei costruttori . Con la nuova soluzione, i costruttori vengono ancora eseguiti in ordine dall’alto verso il basso durante l’istanziazione della classe, ma fornisce agli sviluppatori maggiore flessibilità per esprimere il comportamento e la logica del costruttore.
454: API di memoria e funzione esterna
Le API per funzioni esterne e memoria avevano già avuto tre anteprime nelle versioni precedenti: JDK 19, 20 e 21. Con Java 22, stanno diventando una funzionalità definitiva.
L’obiettivo di questa funzione fra Le novità Java 22, è di fornire interoperabilità con codice e dati esterni al runtime Java senza utilizzare la Java Native Interface (JNI). Questa nuova API consente agli sviluppatori di invocare funzioni esterne (codice esterno alla JVM) e di accedere in modo sicuro alla memoria non gestita dalla JVM.
JNI è considerato un modo fragile e non sicuro per chiamare librerie native ed elaborare dati nativi. Come soluzione superiore in termini di prestazioni, integrità e ampio supporto di piattaforma, la nuova API Foreign function & memory è destinata a sostituire completamente JNI . Offre un modo solido e uniforme per operare su dati strutturati o non strutturati in una varietà di tipi di memoria (ad esempio memoria heap nativa, persistente e gestita).
456: Variabili e modelli senza nome
Un’altra funzionalità che ha attraversato una fase di anteprima in Java 21 , ovvero le variabili e i pattern senza nome, è diventata una funzionalità definitiva in JDK 22.
Contrassegnati dal carattere di sottolineatura (‘_’), i pattern e le variabili senza nome migliorano la chiarezza e la manutenibilità del codice e riducono la possibilità di errore . Le variabili e i pattern senza nome sono comuni a molti linguaggi, tra cui Scala e Python; da JDK 22 in poi, saranno disponibili anche in Java. Cosa significano esattamente? Ecco una rapida spiegazione:
- Le variabili senza nome sono variabili che possono essere inizializzate ma non vengono utilizzate.
- I modelli senza nome corrispondono a un componente record senza specificarne il nome o il tipo.
Introducendo variabili e pattern senza nome, questa nuova funzionalità aiuta a catturare meglio l’intento dello sviluppatore per i parametri inutilizzati (ad esempio variabili che devono essere dichiarate ma non saranno utilizzate) ed elimina la necessità di utilizzare pattern di tipo annidati. Il suo utilizzo aiuta a ridurre gli avvisi di analisi del codice sorgente statico come “argomento di ritorno non utilizzato” o “variabile dichiarata ma non utilizzata” nel caso in cui siano stati fatti come scelte intenzionali dallo sviluppatore.
Le variabili senza nome possono essere utilizzate nei seguenti casi:
- Una dichiarazione di variabile locale in un blocco
- La specifica delle risorse di un’istruzione try-with-resources
- L’intestazione di un ciclo for di base
- L’intestazione di un ciclo for migliorato
- Un parametro di eccezione di un blocco catch
- Un parametro formale di un’espressione lambda Fonte : https://openjdk.org/jeps/443
Diamo un’occhiata al seguente esempio tratto dal JEP :
static int count(Iterable orders) {
int total = 0;
for (Order order : orders) // order is unused
total++;
return total;
}
La variabile locale order deve essere dichiarata per iterare sugli elementi di orders, ma è irrilevante per il corpo del ciclo. Utilizzando una variabile senza nome, il codice sopra può essere semplificato in:
static int count(Iterable orders) {
int total = 0;
for (Order _ : orders) // Unnamed variable
total++;
return total;
}
Oltre alle variabili senza nome, possono essere utilizzati anche pattern senza nome. Guarda il seguente esempio:
static void printColorOfUpperLeftPoint(Rectangle r) {
if (r instanceof Rectangle(ColoredPoint(Point p, Color c),
ColoredPoint lr)) {
System.out.println(c);
}
}
Con pattern senza nome, possiamo dichiarare esplicitamente che Point pe ColoredPoint lrsono irrilevanti per il codice precedente. Ciò aiuta a semplificare il frammento di codice soprastante in:
static void printColorOfUpperLeftPoint(Rectangle r) {
if (r instanceof Rectangle(ColoredPoint(, Color c),) {
System.out.println(c);
}
}
457: API Class-File – Le novità Java 22
Un’altra nuova funzionalità (in anteprima) di Java 22 è un’API standard per l’analisi, la generazione e la trasformazione dei file di classe Java .
I file di classe sono importanti perché consentono agli sviluppatori di strumenti e librerie di terze parti di aggiungere funzionalità, assicurandosi al contempo che il loro codice sorgente sia facile da gestire. Java offre una varietà di librerie per l’analisi e la generazione di file di classe, in modo che gli sviluppatori possano trovare quella che funziona meglio per il loro caso d’uso. Tuttavia, la rapida evoluzione dei formati di file di classe pone una sfida di compatibilità.
Con la nuova API, è possibile elaborare i file di classe mentre si tiene traccia del formato del file di classe definito dalla Java Virtual Machine Specification . L’API si evolve insieme al formato del file di classe, assicurandosi che siano supportati i file di classe JDK più recenti. Ciò consente agli sviluppatori di utilizzare le funzionalità di linguaggio e VM più recenti senza doversi preoccupare della compatibilità.
458: Avvia programmi con codice sorgente multi-file
Questa nuova funzionalità consente al Java application launcher di eseguire programmi che vengono confezionati in più file di codice sorgente . L’obiettivo è di rendere più semplice la transizione da programmi piccoli a grandi, consentendo agli sviluppatori di rimandare il compito di dover configurare uno strumento di compilazione per tutto il tempo che ritengono opportuno.
Fin da JDK 11, il Java application launcher è in grado di eseguire file .java direttamente senza dover passare attraverso la compilazione. Supponiamo, ad esempio, che tu abbia un metodo main nel file App.java. Puoi quindi eseguire questa applicazione semplicemente usando java App.java.
Fino a JDK 22, questa soluzione era limitata alle applicazioni a file singolo. Se la tua applicazione è fornita in più di un file sorgente Java, al momento devi tornare a compilare i file sorgente in modo esplicito. Ciò cambia con questa nuova funzionalità in Java 22, dando agli sviluppatori la libertà di sperimentare e hackerare senza dover compilare il programma in modo esplicito: basta modificare, eseguire e ripetere.
Il Java application launcher compilerà tutte le classi a cui si fa riferimento (direttamente o indirettamente) App.javae che risiedono nella stessa directory . Le classi che non sono referenziate ma risiedono nella stessa directory non saranno compilate automaticamente. Ciò consente una transizione più semplice da programmi piccoli a grandi, consentendo agli sviluppatori di scegliere se (e quando) configurare uno strumento di compilazione.
459: Modelli di stringa
Se avete letto il nostro report sulla precedente versione di Java, saprete che i template di stringa hanno già avuto la loro prima fase di anteprima in JDK 21. In Java 22, saranno inclusi nella seconda anteprima (l’unica differenza rispetto alla prima è una modifica tecnica nei tipi di espressioni del template).
I template di stringa consentono agli sviluppatori di combinare testo letterale con espressioni incorporate e processori di template . Insieme ai letterali di stringa e ai blocchi di testo (già parte di Java), questa nuova funzionalità consente agli sviluppatori di produrre risultati non stringa specializzati che vengono calcolati in fase di esecuzione.
Questa nuova funzionalità migliora la leggibilità di tali espressioni miste, aumenta la sicurezza e offre flessibilità nell’utilizzo di API che accettano stringhe in linguaggi non Java come SQL, XML o JSON.
Ecco un semplice esempio di modello di stringa:
String name = "Joan";
String info = STR."My name is {name}";
assert info.equals("My name is Joan"); // true
In questo esempio, STR è un processore di template che esegue interpolazioni di stringhe e che viene automaticamente importato staticamente in qualsiasi classe Java. È in grado di valutare espressioni di template come STR.”My name is {name}”. Sono disponibili per l’uso processori di template dedicati come FMT(per interpretare gli specificatori di formato). Consulta JEP per scoprire come specificare processori di template definiti dall’utente.
460: API vettoriale
Anche la Vector API non è una novità. Ha raggiunto la sesta fase di incubazione in JDK 21 e ha subito solo piccoli miglioramenti (correzioni di bug e miglioramenti delle prestazioni) per la sua settima incubazione in Java 22. L’unica modifica degna di nota rispetto alla sesta incubazione in JDK 21 è che ora l’API supporta l’accesso vettoriale con MemorySegments heap supportati da un array di qualsiasi tipo di elemento primitivo (invece di un array di byte, come in precedenza).
La nuova API consente l’ espressione di calcoli vettoriali che vengono compilati in fase di esecuzione in istruzioni vettoriali ottimali (sulle architetture CPU supportate, ad esempio architetture x64 e AArch64). L’API vettoriale può quindi contribuire a migliorare le prestazioni, consentendo al contempo l’espressione chiara di un’ampia gamma di calcoli vettoriali.
Come parte del Progetto Valhalla, si prevede che Vector API rimanga in incubazione per diverse release. Il Progetto Valhalla mira a migliorare il modello di oggetti di Java, il che significa che le attuali classi basate sul valore di Vector API saranno modificate in classi di valore per consentire alle applicazioni di lavorare con oggetti di valore (istanze di classe senza identità di oggetto).
461: Raccoglitori di flussi
La Stream API in Java consente di elaborare flussi di dati con un numero teoricamente infinito di valori. Una pipeline di flusso contiene tre tipi di elementi:
- Un flusso di elementi
- Qualsiasi numero di operazioni intermedie
- Un’operazione di chiusura
Diamo un’occhiata al seguente esempio tratto dal JEP :
long numberOfWords =
Stream.of("the", "", "fox", "jumps", "over", "the", "", "dog") // (1)
.filter(Predicate.not(String::isEmpty)) // (2)
.collect(Collectors.counting()); // (3)
L’espressione soprastante calcola il numero di parole all’interno del flusso fornito.
- (1) mostra la definizione del flusso
- (2) un’operazione intermedia e
- (3) un’operazione di chiusura.
Finora erano disponibili diverse operazioni intermedie predefinite, ma non c’era alcuna opzione per definirne di personalizzate. Gli Stream gatherer consentono alla Stream API di supportare operazioni intermedie personalizzate per migliorare la flessibilità e l’espressività delle pipeline Stream.
Questa funzionalità di anteprima di Stream Gatherers migliora le pipeline di Stream, consentendo loro di eseguire operazioni di trasformazione dei dati che superano le limitazioni delle attuali operazioni intermedie integrate. Stream Gatherers consentirà alle operazioni intermedie personalizzate di gestire flussi di dimensioni infinite.
462: Concorrenza strutturata
Un’altra funzionalità che è stata anticipata in JDK 21 , Structured Concurrency mira a semplificare la programmazione multithread. Questa nuova funzionalità consente agli sviluppatori di gestire attività correlate in esecuzione in thread separati come un’unica unità di lavoro . Ciò presenta una serie di vantaggi, tra cui una migliore gestione e cancellazione degli errori, una maggiore affidabilità e una maggiore trasparenza nell’osservazione di queste attività.
Gli sviluppatori JDK sperano che questa funzionalità li incoraggi ad adottare uno stile di programmazione concorrente che contribuisca a ridurre i rischi comuni associati all’annullamento e all’arresto (si pensi a problemi come perdite di thread e ritardi nell’annullamento).
463: Classi dichiarate implicitamente e metodi principali dell’istanza
Sebbene questa funzionalità sia stata rinominata, potresti conoscerla da Java 21 come 445: Unnamed Classes and Instance Main Methods . L’obiettivo principale di questa funzionalità è aiutare i nuovi utenti Java (ad esempio studenti) a scrivere programmi prima di comprendere a fondo tutte le funzionalità del linguaggio che sono destinate a essere utilizzate con programmi di grandi dimensioni come classi e modificatori.
Grazie alle classi dichiarate implicitamente e ai metodi principali delle istanze, gli studenti possono scrivere dichiarazioni semplificate per programmi semplici a classe singola , mentre gli insegnanti possono introdurre gradualmente concetti più avanzati nel linguaggio Java.
Senza questa funzionalità, ora nel secondo stato di anteprima, il tipico programma HelloWorld in Java si presenta così:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
Con questa funzionalità non è più necessario utilizzare String[]args come parametro, semplificando il frammento di codice in:
void main() {
System.out.println("Hello, World!");
}
464: Valori con ambito
Infine, c’è la nuova funzionalità dei valori con ambito, già presentata in anteprima in JDK 21. I valori con ambito consentono agli sviluppatori di condividere dati immutabili (con frame figlio nello stesso thread e con thread figlio) all’interno e tra thread , senza l’uso di argomenti di metodo.
I valori con ambito formano una potente combinazione con Virtual Threads e Structured Concurrency, offrendo costi di spazio e tempo inferiori. L’obiettivo principale dell’introduzione di questa nuova funzionalità è facilitare il ragionamento sul flusso di dati migliorando al contempo robustezza, prestazioni e comprensibilità.
Riepilogo – Le novità Java 22
Ecco un elenco dettagliato di tutte le nuove funzionalità brillanti che saranno rilasciate con Java 22 il 19 marzo 2024. Siamo entusiasti di iniziare a utilizzare JDK 22 per i suoi aggiornamenti che consentono maggiore flessibilità, migliore chiarezza del codice e manutenibilità.
Statements before super(…)è una nuova funzionalità utile per ogni sviluppatore Java, in quanto semplifica l’espressione del comportamento e della logica del costruttore. Non vediamo l’ora che Unnamed Variables & Patterns diventi una funzionalità definitiva, in quanto chiarisce l’uso di parametri inutilizzati.
Come accennato nella nostra analisi di Java 21, String templates è una fantastica nuova funzionalità in quanto aiuta a migliorare la leggibilità delle espressioni miste. E infine, complimenti per le classi dichiarate in modo implicito e i metodi principali delle istanze, che renderanno più facile per chi è alle prime armi con Java imparare le basi.
Innovaformazione, scuola informatica specialistica promuove la cultura dell’aggiornamento continuo degli sviluppatori Java e non. Trovate sul nostro sito l’elenco Corsi Oracle Java .
INFO: info@innovaformazione.net / Tel. 3471012275 (Dario Carrassi)
(fonte)
Articoli correlati
Claude Code e Migrazioni SAP
Claude Code controllo remoto
Opportunità Carriera Contabilità SAP
Guida SIA AI
Guida Dual LLM Verification
