Project Valhalla llega al JDK 28: una década de trabajo en clases valor

Fuentes: Project Valhalla, Explained: How a Decade of Work Arrives in JDK 28

Project Valhalla, la iniciativa de OpenJDK que arrancó en 2014 para acercar el modelo de programación de Java al rendimiento de los tipos primitivos, entrará por fin en el repositorio principal de OpenJDK como característica de previsualización en JDK 28. Lo confirmó el 15 de junio la ingeniera de Oracle Lois Foltan a través de la lista de correo jdk-dev, con la JEP 401 (Value Classes and Objects) ya integrada en una pull request que añade más de 197.000 líneas de código repartidas en 1.816 ficheros.

El objetivo de Valhalla se resume en el lema «se programa como una clase, funciona como un int»: poder declarar clases planas y densas en memoria, sin la sobrecarga de cabeceras, punteros y recolecciones de basura que arrastra cualquier tipo referencia en la JVM. En la práctica, en Java todo lo que no es uno de los ocho primitivos (int, long, double, boolean…) vive como puntero en el heap, con su cabecera, sus indirecciones y sus caches misses, un lastre que el escape analysis del JIT no siempre puede eliminar.

La integración llega en modo preview, desactivada por defecto, y Brian Goetz, arquitecto jefe del lenguaje en Oracle, ya advirtió de que se trata solo de la primera parte del proyecto. Durante una década el equipo construyó cinco prototipos sucesivos que descartaron ideas como los tipos valor tipo puntero, la especialización genérica y el modelo L-world antes de llegar al diseño actual de la JEP 401, centrado en clases valor con identidad opcional y restricciones de nulabilidad, mutabilidad y herencia. La JEP 482 extiende los generics para admitirlas y la JEP 491 sincroniza instanceof y pattern matching con la nueva jerarquía.

Valhalla interesa sobre todo a quien trabaja con colecciones de datos pequeñas y masivas, gráficos, simulación, machine learning, bases de datos o cualquier código donde evitar una indirección por elemento marque una diferencia real. También obligará a migrar librerías y reflejos: herramientas como Jackson, Gson o Hibernate tendrán que adaptarse, y los mapas de serialización y frameworks de inyección de dependencias deberán marcar explícitamente qué clases son valor. La entrega llega, por tanto, con un manual de transición: tocará recompilar, ejecutar tests, perfilar antes y después y, sobre todo, tener paciencia hasta que la JVM dé el salto de preview a definitivos.