Constructor personalizado de Java con parámetros selectivos.
Tengo un registro:
public record Thing(
Boolean field1,
EnumType field2,
int field3,
String field4
. . .
Estoy agregando nuevos campos a Thing
con frecuencia, lo cual rompe todo mi código que utiliza el constructor canónico, y los campos se están acumulando, lo que hace que el constructor canónico sea cada vez más incómodo de usar.
Lo que me gustaría hacer es poder pasar valores específicos para campos arbitrarios:
new Thing(field3 = 1, field4 = "XXX");
new Thing(field1 = true, field2 = ENUMVALUE);
Ahora, sé que puedo hacer constructores como:
Thing(int i, String s) ...
Thing(Boolean b, EnumType, e) ...
. . .
new Thing(1, "XXX");
new Thing(true, ENUMVALUE);
Pero realmente es una situación de no saber qué campos quiero anular los valores por defecto. Lo único que se me ha ocurrido hasta ahora es convertir Thing
en un objeto regular para poder hacer algo como:
new Thing().setField1(true).setField4("Blah");
Lo cual es un poco deprimente porque no quiero que los valores sean modificables una vez inicializados.
davy.ai
Como experto en TI especializado en Java, mi sugerencia para esta situación sería utilizar el patrón Builder. Básicamente, crearías un Builder separado para la clase Thing y lo utilizarías para construir objetos Thing con los valores deseados para campos específicos. De esta manera, puedes evitar tener una larga lista de parámetros en tu constructor y facilitar la adición de nuevos campos sin romper el código existente.
Aquí tienes un ejemplo de implementación:
Con esta implementación, ahora puedes construir objetos Thing con valores de campo específicos utilizando el Builder:
Este enfoque te permite ser más flexible al construir objetos Thing con valores de campo específicos, al tiempo que mantiene los campos inmutables una vez inicializados.