¿Cómo le pongo un setter a un record de Java?

¿Quieres ponerle un setter a un record de Java para cambiar el valor de un atributo una vez instanciado? Tengo malas noticias: no puedes, porque son estructuras de datos inmutables. Sin embargo, no todo está perdido, podemos derivar unos registros a partir de los datos de otros.

El resumen es que no puedes ponerle un setter a un record de Java, debido a que los records por su propia naturaleza son inmutables, en otras palabras, los atributos se compilan con los modificadores private final. Sin embargo, si realmente quieres poder hacer algo parecido a un setter, puedes utilizar métodos de mutación que devuelvan una copia del record que intentas modificar. Si bien esto no altera la instancia original, te devuelve una copia del record donde todos los atributos se conservan a excepción de uno que habrá cambiado de valor:

public record Producto(String nombre, int precio) {
  public Producto setNombre(String nombre) {
    return new Producto(nombre, this.precio);
  }
  public Producto setPrecio(int precio) {
    return new Producto(this.nombre, precio);
  }
}

Con esto se hace fácil mutar un producto para alterar una propiedad, aunque tienes que tener en cuenta que te va a devolver una instancia diferente de la clase que has modificado:

Producto p = new Producto("arroz", 300);
Producto q = p.setPrecio(600);
Producto r = p.setNombre("pollo");

En este caso tenemos tres instancias diferentes:

  • p: arroz con precio 300
  • q: arroz con precio 600
  • r: pollo con precio 600
Lista de reproducción
  1. 1
    Records de Java: qué son y cómo usarlos
    8 minutos
  2. 2
    ¿Cómo le pongo un setter a un record de Java?
    4 minutos
  3. 3
    Records vs Clases: ¿qué me interesa usar?
    7 minutos
  4. 4
    Pattern matching con records en Java
    9 minutos