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.

¿Cómo debo resolver el problema de necesitar llamar a this() y super() al mismo tiempo?

Vale, entonces tengo un problema bastante específico. Tengo una estructura de clases similar a esta (simplificada para facilitar la comprensión).

class A {
    A() {
        // larga inicialización
    }

    A(int someValue) {
        this();
        // hacer algo con someValue
    }
}

class B extends A {
    B() {
        super();
        // larga inicialización
    }

    B(int someValue) {
        // ¿Qué debo hacer aquí?
    }
}

Pero ahora quiero ser capaz de construir la clase B utilizando el segundo constructor. Sin embargo, el segundo constructor debería llamar al constructor super(someValue) para hacer uso del parámetro someValue, pero al mismo tiempo debe llamar a this() para evitar duplicar la inicialización de esta clase. El problema es que no puedo llamar a los constructores this y super al mismo tiempo.

Además, no puedo extraer la inicialización del primer constructor a algún método, porque tengo algunos campos final que necesitan inicializarse dentro del constructor para mantenerse final.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para resolver este problema, puedes crear un nuevo constructor en la clase A que tome tanto el parámetro int someValue como una bandera boolean que indique si realizar o no la inicialización larga. Luego, en la clase B, puedes llamar a ese nuevo constructor de A pasando el parámetro someValue y true para la bandera para realizar la inicialización larga, y también llamar this() para evitar duplicar la inicialización de B. Aquí está el código actualizado:

    class A {
        A() {
            // inicialización larga
        }
    
        A(int someValue, boolean doLongInitialization) {
            if (doLongInitialization) {
                // inicialización larga
            }
            // hacer algo con someValue
        }
    }
    
    class B extends A {
        B() {
            super();
            // alguna inicialización larga
        }
    
        B(int someValue) {
            super(someValue, true);
            this();
        }
    }
    

    Con este enfoque, puedes construir B utilizando el segundo constructor y aún utilizar el parámetro someValue y la inicialización larga tanto de A como de B.

Comments are closed.