JEP 401: Value Objects (Vista previa) se fusiona en OpenJDK master
El proyecto de largo recorrido Valhalla de Java ha alcanzado su primer gran hito en OpenJDK: los “value objects” en vista previa, un nuevo tipo de clase sin identidad de objeto diseñado para aportar rendimiento estilo struct sin renunciar a las fuertes garantías de memoria y concurrencia de Java. Los comentaristas lo ven como aproximadamente “la mitad” de Valhalla y la parte más importante, ya que permitirá un mejor uso de los generics y diseños de datos más eficientes, aunque señalan que aún queda trabajo en nullabilidad, generics especializados y tipos de valor desmontables. El cambio también provoca reflexiones más amplias sobre la evolución cauta y compatible hacia atrás de Java, su enfoque en el rendimiento frente a C# y JavaScript, y la distancia entre el lenguaje moderno y su pesado ecosistema empresarial.
Alcance de Project Valhalla y JEP 401
- JEP 401 (Value Objects, Preview) se ha fusionado; se considera la primera y crucial mitad de Project Valhalla (aproximadamente “~50%” de la visión).
- El trabajo restante incluye generics especializados, APIs SIMD/vectoriales, generics reificados y tipos no anulables.
- Muchos comentaristas dicen que esto por sí solo ya convierte a Valhalla en un éxito, especialmente para el rendimiento.
Value Objects: semántica y rendimiento
- Los value objects se describen como “tipo estructura”: sin identidad, inmutables, aplanables cuando sea posible, con grandes beneficios de memoria y caché.
- El diseño hace hincapié en la “integridad por defecto”: semántica segura y garantías sólidas, con opciones de rendimiento como opt-ins explícitos.
- Un marco de diseño divide los datos en cuatro grupos: objetos clásicos, objetos sin identidad, valores atómicos y valores desmontables (“classical”).
Integer, identidad y Strings
Integery envoltorios similares pasan a ser clases de valor, perdiendo la identidad de objeto; muchos señalan queIntegerya se comporta de forma “similar a un valor” por el pooling yhashCode.- Los proyectos que dependen de la identidad de
Integerhan tenido años de advertencia; algunas herramientas de nicho (p. ej., runtimes de lenguajes dirigidos a la JVM) pueden verse afectadas. - Los Strings no pueden convertirse en tipos de valor plenamente indistinguibles principalmente por compatibilidad hacia atrás y restricciones técnicas en torno a arrays de respaldo de longitud variable; además, las mejoras se consideran limitadas de todos modos.
Atomicidad, tearability y límites de tamaño
- La discusión se centra en la atomicidad: las clases de valor no deben “tear” salvo que se marquen explícitamente como tearable.
- El modelo actual vincula el aplanamiento de referencias al tamaño de palabra de la máquina (p. ej., 63 bits + bit nulo); pueden existir valores mayores, pero no pueden aplanarse de la misma manera.
- Algunos sostienen que otras plataformas (p. ej., .NET, CPUs con atómicos de 128 bits) muestran compensaciones distintas; otros subrayan que el modelo de memoria de Java y las garantías de seguridad dictan el diseño.
Compatibilidad hacia atrás y migración
- Hay una fuerte apreciación por la estabilidad a largo plazo de Java: el código antiguo normalmente sigue funcionando sin cambios; los cambios incompatibles son raros, están bien señalizados y son limitados.
- Ejemplo: sincronizar sobre instancias de
Integeracabará rompiéndose cuando se conviertan en value objects. - La semántica de valor se define en el sitio de declaración, no en el de uso, para garantizar que la inmutabilidad y la seguridad puedan ser impuestas por la propia clase.
Proceso y gobernanza de OpenJDK
- La PR aplasta miles de commits en uno mediante un bot; el historial detallado se conserva en herramientas separadas, no en Git.
- A algunos no les gusta el historial de Git “destruido”; otros sostienen que el proceso es intencional para evitar el bloqueo en GitHub y mantener portables las herramientas externas.
- Se informa que el trabajo de Valhalla está impulsado de forma abrumadora por Oracle, con elogios por su disciplina y visión a largo plazo frente a la cultura típica de “lanzar pronto”.
Impacto en el ecosistema
- Se espera que mejore significativamente el rendimiento de Java y de lenguajes JVM de nivel superior como Scala, especialmente donde hoy la abstracción es costosa.
- Se destacan como futuras grandes mejoras los generics sobre tipos de valor y una mejor especialización del layout.
Lenguaje Java, cultura y comparaciones
- Muchos expresan un fuerte entusiasmo por Java moderno: records, lambdas, streams, virtual threads, structured concurrency y, ahora, value objects.
- Varios argumentan que Java ha evolucionado de forma más limpia que C# (visto por algunos como sobredimensionado) y mantiene un modelo más simple (valor vs referencia + Valhalla).
- La crítica persistente gira en torno a la “cultura empresarial”: frameworks verbosos (especialmente Spring), nombres de clases largos y bases de código enormes; otros responden que esto es cultural, no inherente a Java.
- Hay menciones positivas de frameworks más ligeros (p. ej., Helidon, Quarkus) y de diseños centrados en virtual threads.
- Java se contrasta repetidamente con JavaScript: sintaxis superficial similar pero objetivos muy distintos; Java se ve por delante en funciones como fecha/hora modernas, expresiones switch y, ahora, value objects.
Herramientas y CLI
- Algunos desearían una CLI unificada, más “baterías incluidas” y similar a Go, para build/test/format/lsp, en lugar de la fragmentación actual (Maven, Gradle, etc.).
- Maven es apreciado por su estabilidad, pero se critica su XML y su modelo de actualización; Gradle se ve como potente pero sensible a la versión.