Translate

sábado, 2 de mayo de 2026

Records vs Project Valhalla en Java


Java viene evolucionando fuerte en dos direcciones:

  • Java Records → escribir menos código
  • Project Valhalla → ejecutar más rápido


A primera vista parecen competir… pero en realidad se complementan.

  • Usá Records → claridad, simplicidad, APIs
  • Usá Valhalla (Value Types) → rendimiento, memoria
  • Usá ambos → lo ideal en sistemas complejos


Records: el rey de la simplicidad

record User(String name, int age) {}


✔ Inmutables

✔ Menos boilerplate

✔ equals, hashCode, toString automáticos


¿Cuándo usar Records?

DTOs / APIs


record ProductDTO(String name, double price) {}


Perfecto para:

  • REST APIs
  • serialización JSON
  • comunicación entre capas


Modelos simples

record Money(double amount, String currency) {}


Cuando te importa más la legibilidad que el rendimiento


Lógica de negocio

  • servicios
  • respuestas intermedias


El overhead de objetos no suele ser un problema


Limitación clave, un record:

  • vive en el heap
  • tiene identidad
  • usa referencias


Valhalla: el rey del rendimiento

Ejemplo conceptual:


value class Point {

    int x, y;

}



✔ Sin identidad

✔ Sin overhead de objeto

✔ Datos contiguos en memoria


¿Cuándo usar Value Types?

Grandes volúmenes de datos


value class Point {

    int x, y;

}


List<Point>


Mucho más eficiente que objetos tradicionales


Simulaciones

  • físicas
  • partículas
  • coordenadas


Miles o millones de instancias


Alto rendimiento

  • trading
  • analytics
  • cálculos intensivos


Menos GC = mejor performance


¿Qué cambia realmente?

Sin Valhalla:

List<Point> // lista de referencias


Con Valhalla:

[x1, y1, x2, y2, x3, y3]


Datos planos → mejor cache → más velocidad


Cuándo NO usar Valhalla

  • Entidades (`User`, `Order`)
  • Objetos con identidad
  • Integración con frameworks clásicos


Si necesitás identidad → no es value type

Lo mejor: combinarlos

Acá está la clave real 👇


Caso 1: Record + Value Type


value class Point {

    int x, y;

}


record Circle(Point center, double radius) {}


Tenés:

API clara (record)

datos eficientes (value)


Caso 2: separación por capas


// API

record PointDTO(int x, int y) {}


// Core

value class Point {

    int x, y;

}


Separás:

  • interfaz → legible
  • core → performante


Caso 3: colecciones grandes


value class Price {

    double amount;

}


List<Price>


Sin boxing → sin referencias → 🔥


Futuro: value records

Se viene algo así:

value record Point(int x, int y) {}


Combina:

  • simplicidad (record)
  • eficiencia (value type)


Conclusión, no es una pelea, es una estrategia:

  • Records → hacen feliz al desarrollador
  • Valhalla → hace feliz a la JVM



No hay comentarios.:

Publicar un comentario