Suponiendo que tengo una superclase que tiene 3 parámetros en su constructor y estoy heredando esta clase que también tiene un constructor con 3 parámetros, y quiero llamar al constructor de la superclase pero antes quiero hacer algo de lógica en la subclase primero , Puedo llamar a un método estático que recibe esos 3 parámetros pero tengo que devolver solo uno, así que esta es la solución que se me ocurrió

public class someClass extends  SuperClass {
    public someClass(int a,int b,int c) {
         super(func(a,b,c),b,c);
    }
    public static int func(int a,int b,int c){
        //usage a b c
        return a;
    }
}

Parece un poco feo y me preguntaba si hay una mejor solución para usar los parámetros yo mismo y luego llamar súper regularmente. Tenga en cuenta que no puedo cambiar la clase Super o los usos de las subclases y, por lo tanto, el patrón de diseño de fábrica

3
Nitzan Farhi 17 ene. 2018 a las 12:06

3 respuestas

La mejor respuesta

Para sacar la lógica de su constructor, puede crear fácilmente un método de fábrica en su subclase:

public class SomeClass extends SuperClass {
    private SomeClass(int a, int b, int c) {
        super(a, b ,c);
    }

    public static SomeClass create(int a, int b, int c){
        // calculate a for constructor

        return new SomeClass(a, b, c);
    }
}

Luego puede crear instancias de la siguiente manera:

SomeClass someClass = SomeClass.create(1, 2, 3);
8
Robby Cornelissen 17 ene. 2018 a las 09:09

En Java, no puede ejecutar otra instrucción antes de la llamada a super. El truco que mencionó funciona, pero no puede refactorizar su código para que llame a func en una declaración antes de la llamada a super.

En mi experiencia, problemas como este a menudo sugieren algún problema de diseño. Quizás pueda resolver el problema subyacente al repensar las responsabilidades de las dos clases involucradas.

3
C-Otto 17 ene. 2018 a las 09:17

También puedes usar el patrón de construcción

public class SomeClass extends SuperClass {
    public static class Builder {
        private int a, b, c;
        public Builder withA(int a) { 
            this.a = a;
            return this;
        }
        public Builder withB(int b) { ... }
        public Builder withC(int c) { ... }
        public SomeClass build() {
            // logic goes here
            return new SomeClass(...)
        }
    }

    // hide this from public use, use Builder instead
    protected SomeClass(int a, int b, int, c) {
        super(a, b, c);
    }
}

SomeClass someClass = new SomeClass.Builder().
    withA(1).
    withB(2).
    withC(3).
    build();
1
lance-java 17 ene. 2018 a las 09:30
48297240