se extiende de la clase con constructor privado

2 minutos de lectura

avatar de usuario de user471011
usuario471011

Supongamos que tenemos el siguiente código:

class Test {
    private Test() {
        System.out.println("test");
    }

}

public class One extends Test {

    One() {
        System.out.println("One");
    }

    public static void main(String args[]) {

        new One();
    }
}

Cuando creamos un objeto Oneque originalmente se llamaba constructor de la clase principal Test(). pero como Test() era privado, recibimos un error. ¿Cuánto vale un buen ejemplo y una salida a esta situación?

Avatar de usuario de Colin Hebert
colin hebert

No hay salida. Tienes que crear un disponible (protected, public o por defecto) super constructor para poder extender test.

Este tipo de notación generalmente se usa en clases de utilidad o singletons, donde no desea que el usuario cree una instancia de su clase, ya sea extendiéndola e instanciando la subclase, o simplemente llamando a un constructor de su clase.

Cuando usted tiene una class con solo private constructores, también puede cambiar el class a final porque no se puede extender en absoluto.


Otra solución sería tener un método en test que crean instancias de test y delegar cada llamada de método desde One a un test instancia. De esta manera no tienes que extender test.

class Test {
    private Test() {
        System.out.println("test");
    }
    public static Test getInstance(){
        return new Test();
    }
    public void methodA(){
        //Some kind of implementation
    }
}

public class One {
    private final Test test;
    One() {
        System.out.println("One");
        test = Test.getInstance();
    }

    public void methodA(){
        test.methodA();
    }

    public static void main(String args[]) {
        new One();
    }
}

  • El método getInstance() de clase Test debe ser estático. De lo contrario, no es posible realizar una llamada como Test.getInstance().

    – vanje

    17 de octubre de 2010 a las 11:37

Hacer el constructor de test no-private o mover One en test.

Por cierto, su código de muestra contiene algunos problemas:

  • las clases deben llamarse title case (Test en lugar de test)
  • Sugiero hacer el Oneconstructor de private a menos que se llame desde una clase diferente en el mismo paquete

avatar de usuario de delphifirst
delphifirst

En realidad, encontré que hay una salida. Como esto:

class Base {
    private Base() {

    }

    public void fn() {
        System.out.println("Base");
    }

    public static class Child extends Base {
        public void fn() {
            System.out.println("Child");
        }
    }

    public static Base getChild() {
        return new Child();
    }
}

Ahora, puede usar getChild() para obtener una instancia de la clase extendida.

  • Esto solo funciona cuando se coloca una clase interna estática porque los métodos privados son accesibles para las clases internas. Desafortunadamente, esto no ayuda, porque si puede cambiar la clase, es mucho mejor configurar el constructor en protegido o público en primer lugar.

    – Lodewijk Bogaards

    23 de febrero de 2015 a las 18:07

¿Ha sido útil esta solución?