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