El mayor cambio de lenguaje de Java en una década finalmente está llegando. Se necesitaron 197,000 líneas de código.
TL;DRLas clases de valor del Proyecto Valhalla llegarán a JDK 28, un cambio de 197,000 líneas que reescribe cómo Java maneja la identidad de los objetos. La ingeniera de software de Oracle, Lois Foltan, ha confirmado que la Propuesta de Mejora de Java 401, que introduce clases y objetos de valor en el lenguaje, se integrará en la línea principal de OpenJDK a principios del próximo mes, con el objetivo de JDK 28. El cambio es parte del Proyecto Valhalla, un esfuerzo de larga data para abordar una de las limitaciones de rendimiento más antiguas de Java. La solicitud de extracción agrega más de 197,000 líneas de código en 1,816 archivos modificados, según The Register. Foltan lo describió como un "cambio extremadamente grande" en una publicación en la lista de correo de OpenJDK y pidió a otros colaboradores que evitaran grandes compromisos durante la ventana de integración. El Kit de Desarrollo de Java actual es la versión 26, con JDK 27 esperado en septiembre de 2026 y JDK 28 en marzo de 2027. JEP 401 llegará como una característica de vista previa, lo que significa que los desarrolladores pueden optar por usarla, pero no estará habilitada por defecto. El problema que aborda JEP 401 es fundamental para el funcionamiento de Java. Fuera de un pequeño conjunto de primitivos como int, char y double, cada tipo en Java es un tipo de referencia. Eso significa que cada objeto tiene su propia identidad única en la memoria, incluso cuando dos objetos contienen datos idénticos. El 💜 de la tecnología de la UE Las últimas novedades de la escena tecnológica de la UE, una historia de nuestro sabio fundador Boris y un arte de IA cuestionable. Es gratis, cada semana, en tu bandeja de entrada. ¡Regístrate ahora! La clase LocalDate de Java, por ejemplo, almacena valores de fecha, pero dos instancias que representan la misma fecha devolverán falso cuando se comparen con el operador == porque son objetos diferentes en la memoria. La clase envoltura Integer hace esto aún más confuso. Java almacena en caché internamente las instancias de Integer para valores por debajo de 128, por lo que dos objetos Integer con el mismo valor pequeño pueden compararse como iguales con ==. Para valores más grandes, == siempre devuelve falso incluso cuando los números subyacentes coinciden. JEP 401 describe este comportamiento como "complejidad no deseada", y los editores de Java generalmente advierten en contra de usar == con Integer como resultado. Las clases de valor eliminan este problema al crear objetos que carecen de identidad por completo. Un objeto de valor se distingue únicamente por los valores de sus campos, no por dónde se encuentra en la memoria. Esto le da a la JVM la libertad de almacenar objetos de valor de maneras que reducen la sobrecarga de memoria y mejoran la localidad de caché. Iterar sobre tipos de valor es más eficiente porque el tiempo de ejecución no necesita desreferenciar punteros para alcanzar los datos reales. JEP 401 migrará algunas clases existentes de JDK, incluida Integer, a clases de valor. Se espera que el número de clases migradas crezca gradualmente en lanzamientos posteriores. Los desarrolladores también podrán declarar sus propias clases de valor para tipos de dominio que representen datos puros, cosas como coordenadas, montos de moneda o marcas de tiempo. El Proyecto Valhalla ha estado en desarrollo desde 2014, lo que lo convierte en uno de los esfuerzos más prolongados en la historia de Java. La complejidad de cambiar cómo funciona la identidad de los objetos a nivel de JVM, mientras se mantiene la compatibilidad hacia atrás con miles de millones de líneas de código Java existente, explica la línea de tiempo. Algunos observadores han bromeado sobre llegar a Valhalla mismo, el reino del más allá en la mitología nórdica, antes de que el proyecto se entregue. El arquitecto del lenguaje Java de Oracle, Brian Goetz, advirtió en Reddit que JEP 401 es "solo la primera parte de Valhalla". Dijo que eliminar la identidad es la primera barrera, que expone nuevas optimizaciones especialmente para objetos más pequeños. Pero tratar completamente los objetos con semántica de valor requiere renunciar a más, incluida la nulabilidad y lo que Goetz llamó "seguridad de atomicidad bajo competencia". Comparó la trayectoria con las estructuras de C#, señalando que otros lenguajes están trabajando en capacidades similares. Goetz también advirtió que Valhalla introducirá cambios deliberados que rompen la compatibilidad. El código que sincroniza en objetos Integer, por ejemplo, fallará con una excepción una vez que Integer se convierta en una clase de valor. Dijo que JEP 401 probablemente aún estará en vista previa en el próximo lanzamiento de soporte a largo plazo del JDK, que se espera que sea JDK 29 en septiembre de 2027. "Esperar que salga de la vista previa para 29 parece... optimista", escribió. El momento llega mientras Oracle reestructura agresivamente, despidiendo hasta 30,000 empleados para financiar su cambio de infraestructura de IA. Pero el equipo de la plataforma Java parece estar en gran medida aislado de esos recortes, y el Proyecto Valhalla representa el tipo de trabajo profundo en el lenguaje que no puede acelerarse lanzando más ingenieros al mismo. Java ganó más de ocho millones de nuevos desarrolladores entre 2021 y 2023, y su relevancia para la computación en la nube y los sistemas empresariales significa que cualquier mejora fundamental en el rendimiento se propaga a través de un vasto ecosistema. Para los millones de desarrolladores de Java que han esperado doce años por tipos de valor, la vista previa en JDK 28 es un hito. Para el resto de Valhalla, el mensaje de Goetz es claro: no contengas la respiración.
Otros artículos
El mayor cambio de lenguaje de Java en una década finalmente está llegando. Se necesitaron 197,000 líneas de código.
El JEP 401 del Proyecto Valhalla traerá clases de valor al JDK 28, eliminando la identidad de objeto de los tipos de Java en un cambio de 197,000 líneas que ha tardado doce años en realizarse.
