es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  ,

Answer

  1. Avatar for 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:

    public class Thing {
        private final Boolean field1;
        private final EnumType field2;
        private final int field3;
        private final String field4;
    
        private Thing(Boolean field1, EnumType field2, int field3, String field4) {
            this.field1 = field1;
            this.field2 = field2;
            this.field3 = field3;
            this.field4 = field4;
        }
    
        // Clase Builder para Thing
        public static class Builder {
            private Boolean field1 = false;
            private EnumType field2 = EnumType.DEFAULT;
            private int field3 = 0;
            private String field4 = "";
    
            public Builder setField1(Boolean field1) {
                this.field1 = field1;
                return this;
            }
    
            public Builder setField2(EnumType field2) {
                this.field2 = field2;
                return this;
            }
    
            public Builder setField3(int field3) {
                this.field3 = field3;
                return this;
            }
    
            public Builder setField4(String field4) {
                this.field4 = field4;
                return this;
            }
    
            public Thing build() {
                return new Thing(field1, field2, field3, field4);
            }
        }
    }
    

    Con esta implementación, ahora puedes construir objetos Thing con valores de campo específicos utilizando el Builder:

    Thing thing1 = new Thing.Builder()
                            .setField3(1)
                            .setField4("XXX")
                            .build();
    Thing thing2 = new Thing.Builder()
                            .setField1(true)
                            .setField2(EnumType.ENUMVALUE)
                            .build();
    

    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.

Comments are closed.