Java 25 è arrivato (16 settembre 2025) e, come previsto, molti vendor lo hanno già battezzato come LTS. In NextWire abbiamo analizzato le novità e la sensazione è netta: non è una release fatta per stupire con rivoluzioni sintattiche, ma per sistemare quello che ancora risulta rallentare nel flusso di lavoro quotidiano e ottimizzare la resa in produzione. L'idea di fondo sembra essere quella di pulire il campo dai piccoli fastidi storici di Java, mantenendo però un confine molto marcato tra ciò che è pronto per il mondo reale e ciò che richiede ancora un giro di prova in preview.

Come lo stiamo approcciando

Per capire se vale la pena aggiornare subito, lo stiamo guardando attraverso cinque lenti:

  • Velocità di prototipazione: quanto è diventato più facile passare dall'idea al codice.
  • Resa operativa: l'impatto reale su piccoli progetti e gestione memoria.
  • Stabilità delle feature: il peso specifico delle funzionalità final.
  • Sforzo di migrazione: quanto tempo bisogna investire per allineare build e configurazioni.
  • Continuità: se la direzione presa è coerente con gli ultimi anni.

Meno preparazione per far girare il codice

Le novità su compact source files, il main() di istanza e l'evoluzione di java.lang.IO non servono a creare un "Java semplificato". Servono a permetterci di scrivere un file, lanciarlo e vedere il risultato senza dover per forza mettere in piedi l'intera impalcatura di una classe formale. Anche import module va in questa direzione: è un dettaglio, certo, ma toglie quel rumore di fondo fatto di decine di import standard che rendono i file meno leggibili.

In breve: Se devi scrivere un micro-tool, uno script di supporto o un prototipo rapido, Java 25 è molto più agile dei suoi predecessori.


Concorrenza: Scoped Values al centro della scena

Il lavoro sul Project Loom prosegue, ma con velocità diverse. La notizia vera qui è la stabilità degli Scoped Values. Chi lavora con i Virtual Threads sa quanto possa essere pesante o rischioso usare ThreadLocal per gestire il contesto. Gli Scoped Values offrono una soluzione più pulita e sicura per passare dati lungo il ciclo di vita di un task. Al contrario, la Structured Concurrency resta ancora in preview: un segnale che, per quanto promettente, la gestione dei task paralleli non è ancora pronta per essere scolpita nella pietra. Il vantaggio pratico: Gestire logging, tracing e correlazioni in sistemi ad alta concorrenza oggi è decisamente più lineare.


Startup e warmup: segnali forti per la produzione

In ambito cloud-native e microservizi, il tempo che un servizio impiega per "entrare a regime" è un costo. Java 25 affronta il problema lavorando su AOT cache (Ahead-Of-Time) e sul profiling per l'ottimizzazione dell'avvio. L'obiettivo non è stravolgere il paradigma, ma fare in modo che la JVM raggiunga le massime prestazioni più velocemente, riducendo quella finestra di tempo in cui il servizio è attivo ma non ancora ottimizzato. Non è un beneficio che si ottiene "gratis" per ogni setup, ma con il giusto tuning i risultati sono tangibili.


Efficienza silenziosa: memoria e GC

Sotto il cofano troviamo i Compact Object Headers e il Generational Shenandoah. Sono cambiamenti che lo sviluppatore non vede scrivendo codice, ma che l'SRE nota osservando i grafici di monitoraggio.

  • Compact Headers: riducono l'overhead di memoria per ogni singolo oggetto. Su applicazioni che gestiscono milioni di istanze, il risparmio non è trascurabile.
  • Generational Shenandoah: punta a rendere la garbage collection ancora più trasparente e meno invasiva su carichi di lavoro importanti.

Una sintesi per punti

Feature Stato Perché ci interessa
Instance Main & IO Final Meno boilerplate per test e piccoli tool.
Scoped Values Final Gestione del contesto sicura per Virtual Threads.
AOT Cache Migliorata Startup più rapidi e prevedibili.
Compact Headers Sperimentale Riduzione del footprint di memoria.