JG
Volver al blog

Records en Java: ¿qué son, ventajas y cuándo usarlos?

Desde Java 14 (y oficialmente en producción desde Java 16), el lenguaje introdujo una de las características más elegantes y prácticas para trabajar con datos inmutables: los Records.

A pesar de su simplicidad, siguen siendo poco aprovechados en muchos proyectos, especialmente en sistemas corporativos o heredados. En los años que llevo trabajando en la industria, solo una vez conocí un desarrollador que los utiliza. Considero que son una herramienta increíble y en este post te explico qué son, por qué son tan útiles y cuáles son sus principales casos de uso.

¿Qué es un Record en Java?

Un Record es un tipo especial de clase diseñada para representar datos inmutables. En lugar de escribir clases completas con constructores, getters, equals, hashCode y toString, un Record permite declarar todo eso con una sola línea.

// Java
public record Usuario(String nombre, String correo) {}

Con esto Java genera automáticamente:

  • Constructor
  • Getters (pero sin prefijo get, se llaman igual que el campo)
  • equals() y hashCode()
  • toString()

Esto reduce un montón de código repetitivo y hace las clases de datos más claras.

Ventajas de usar Records

1. Menos código, más claridad

Evitan el boilerplate, lo cual hace que las clases de datos sean más fáciles de revisar y mantener. Una clase simple que antes ocupaba 30–40 líneas ahora se convierte en una sola.

2. Inmutabilidad por defecto

Los campos de un Record son final, lo que favorece un diseño seguro, especialmente en:

  • Aplicaciones concurrentes
  • Programación funcional
  • APIs limpias y predecibles

3. Son clases completas

A pesar de su simplicidad, pueden tener:

  • Métodos adicionales
  • Validaciones en el constructor compacto
  • Implementación de interfaces
  • Anotaciones

Ejemplo con validación:

public record Producto(String nombre, double precio) {
    public Producto {
        if (precio < 0) {
            throw new IllegalArgumentException("El precio no puede ser negativo");
        }
    }
}

4. Perfectos para objetos de transferencia (DTO)

Muchos frameworks modernos (Spring Boot, Micronaut, Quarkus) los soportan perfectamente para:

  • Peticiones y respuestas REST
  • Mensajes en colas
  • Mapeo JSON

Y funcionan bien con Jackson y Gson.

Casos de uso recomendados

Como toda herramienta en el mundo del desarrollo de software, los Records también tienen sus casos de uso específicos en los que son ideales. Algunos ejemplos:

  1. DTOs y respuestas de APIs REST: Cuando solo necesitas transportar datos y no lógica compleja.
   public record LoginRequest(String usuario, String password) {}
  1. Modelos de configuración: Representan estructuras simples y seguras.
  2. Eventos (Domain Events, mensajes en colas): Su inmutabilidad evita errores inesperados en sistemas distribuidos.
  3. Value Objects en DDD: Para objetos como: Email, Coordenadas, Money, Rango de fechas:
public record Email(String value) {
    public Email {
        if(!value.contains("@")) throw new IllegalArgumentException("Email inválido");
    }
}
  1. Mapeo temporal de datos: Cuando solo necesitas un contenedor de información sin crear una clase enorme.

Cuándo NO usar Records

Aunque son muy útiles, los Records no son para todo. Evítalos cuando:

  • Necesites propiedades mutables.
  • La clase contiene lógica compleja.
  • Necesitas herencia (los Records no pueden extender otras clases).
  • Requieres compatibilidad con frameworks antiguos que no los soportan bien.

Como puedes ver, no siempre debes usar los Records, son herramientas que tenemos disponibles y debemos darles el uso correcto. Te animo a que utilices los Records en los casos que si cumplen su objetivo, en el tiempo que llevo trabajando en la industria en muy pocas ocasiones he encontrado desarrolladores que los utilicen activamente.

Java cada vez agrega cosas más modernas e interesantes, pero no sirve de nada si la comunidad no las usa. Hay que permanecer actualizados.