Il più grande cambiamento del linguaggio Java in un decennio sta finalmente arrivando. Ci sono volute 197.000 righe di codice.
TL;DRLe classi valore di Project Valhalla stanno arrivando in JDK 28, un cambiamento di 197.000 righe che riscrive il modo in cui Java gestisce l'identità degli oggetti. L'ingegnere software di Oracle Lois Foltan ha confermato che la Proposta di Miglioramento di Java 401, che introduce classi valore e oggetti nel linguaggio, sarà integrata nella mainline di OpenJDK all'inizio del mese prossimo, puntando a JDK 28. Il cambiamento fa parte del Project Valhalla, uno sforzo di lunga data per affrontare una delle più antiche limitazioni delle prestazioni di Java. La richiesta di pull aggiunge più di 197.000 righe di codice in 1.816 file modificati, secondo The Register. Foltan l'ha descritta come un "cambiamento estremamente grande" in un post alla mailing list di OpenJDK e ha chiesto ad altri committers di evitare grandi commit durante la finestra di integrazione. L'attuale Java Development Kit è la versione 26, con JDK 27 previsto per settembre 2026 e JDK 28 a marzo 2027. JEP 401 arriverà come funzionalità in anteprima, il che significa che gli sviluppatori possono scegliere di partecipare, ma non sarà abilitato per impostazione predefinita. Il problema che JEP 401 affronta è fondamentale per il funzionamento di Java. Al di fuori di un piccolo insieme di primitivi come int, char e double, ogni tipo in Java è un tipo di riferimento. Ciò significa che ogni oggetto ottiene la propria identità unica in memoria, anche quando due oggetti contengono dati identici. La classe LocalDate di Java, ad esempio, memorizza valori di data, ma due istanze che rappresentano la stessa data restituiranno false quando confrontate con l'operatore == perché sono oggetti diversi in memoria. La classe wrapper Integer rende tutto questo ancora più confuso. Java memorizza internamente le istanze di Integer per valori inferiori a 128, quindi due oggetti Integer con lo stesso piccolo valore possono essere confrontati come uguali con ==. Per valori più grandi, == restituisce sempre false anche quando i numeri sottostanti corrispondono. JEP 401 descrive questo comportamento come "complessità indesiderata", e gli editor di Java generalmente avvertono contro l'uso di == con Integer come risultato. Le classi valore eliminano questo problema creando oggetti che mancano completamente di identità. Un oggetto valore è distinto esclusivamente dai valori dei suoi campi, non da dove si trova in memoria. Questo dà alla JVM la libertà di memorizzare gli oggetti valore in modi che riducono l'overhead di memoria e migliorano la località della cache. Iterare su tipi valore è più efficiente perché il runtime non deve dereferenziare i puntatori per raggiungere i dati effettivi. JEP 401 migrerà alcune classi JDK esistenti, inclusa Integer, a classi valore. Si prevede che il numero di classi migrate cresca gradualmente nei successivi rilasci. Gli sviluppatori potranno anche dichiarare le proprie classi valore per tipi di dominio che rappresentano dati puri, cose come coordinate, importi di valuta o timestamp. Il Project Valhalla è in sviluppo dal 2014, rendendolo uno degli sforzi più lunghi nella storia di Java. La complessità di cambiare il modo in cui funziona l'identità degli oggetti a livello di JVM, mantenendo la compatibilità con miliardi di righe di codice Java esistente, spiega la tempistica. Alcuni osservatori hanno scherzato sul raggiungere Valhalla stessa, il regno dell'aldilà nella mitologia norrena, prima che il progetto venga rilasciato. L'architetto del linguaggio Java di Oracle Brian Goetz ha avvertito su Reddit che JEP 401 è "solo la prima parte di Valhalla". Ha detto che rimuovere l'identità è la prima barriera, che espone nuove ottimizzazioni, specialmente per oggetti più piccoli. Ma trattare completamente gli oggetti con semantica valore richiede di rinunciare a di più, inclusa la nullabilità e ciò che Goetz ha definito "atomicità-sicurezza-sotto-concorrenza". Ha confrontato la traiettoria con le strutture C#, notando che altri linguaggi stanno lavorando su capacità simili. Goetz ha anche avvertito che Valhalla introdurrà cambiamenti deliberati. Il codice che si sincronizza su oggetti Integer, ad esempio, fallirà con un'eccezione una volta che Integer diventa una classe valore. Ha detto che JEP 401 sarà probabilmente ancora in anteprima nel prossimo rilascio di supporto a lungo termine del JDK, che dovrebbe essere JDK 29 a settembre 2027. "Sperare che esca dall'anteprima per il 29 sembra... ottimista", ha scritto. Il tempismo arriva mentre Oracle si ristruttura in modo aggressivo, tagliando fino a 30.000 dipendenti per finanziare il suo pivot verso l'infrastruttura AI. Ma il team della piattaforma Java sembra essere in gran parte isolato da questi tagli, e il Project Valhalla rappresenta il tipo di lavoro profondo sul linguaggio che non può essere accelerato semplicemente aumentando il numero di ingegneri. Java ha guadagnato più di otto milioni di nuovi sviluppatori tra il 2021 e il 2023, e la sua rilevanza per il cloud computing e i sistemi aziendali significa che qualsiasi miglioramento fondamentale delle prestazioni si ripercuote su un vasto ecosistema. Per i milioni di sviluppatori Java che hanno aspettato dodici anni per i tipi valore, l'anteprima in JDK 28 è un traguardo. Per il resto di Valhalla, il messaggio di Goetz è chiaro: non trattenere il respiro.
Altri articoli
Il più grande cambiamento del linguaggio Java in un decennio sta finalmente arrivando. Ci sono volute 197.000 righe di codice.
Il JEP 401 del Progetto Valhalla porterà le classi valore nel JDK 28, rimuovendo l'identità degli oggetti dai tipi Java in una modifica di 197.000 righe che ha richiesto dodici anni per essere realizzata.
