2010-10-17 17 views
39

Supongamos que tenemos el siguiente código:se extiende de la clase con constructor privado

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 One, que originalmente fue llamado el constructor de la clase padre Test(). pero como Test() era privado, recibimos un error. ¿Cuánto es un buen ejemplo y una forma de salir de esta situación?

Respuesta

39

No hay salida. Debe crear un superconstructor (protected, public o predeterminado) disponible para poder ampliar test.

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

Cuando se tiene un class con sólo private constructores, también puede cambiar el class-final porque no puede ser extendida a todos.


Otra solución sería tener un método en el que test crear instancias de test y delegar cada método de llamada de One a una instancia test. De esta manera no tiene 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(); 
    } 
} 
+4

El método 'getInstance()' de la clase 'Test' debe ser estático. De lo contrario, no es posible hacer una llamada como 'Test.getInstance()'. – vanje

+0

@vanje, gracias, actualizado –

1

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

Por cierto, el código de ejemplo contiene algunos problemas:

  • clases deben ser nombrados caso del título (Test en lugar de test)
  • yo sugeriría hacer constructor private la One 's menos que se trate llamado desde una clase diferente en el mismo paquete
+0

¿Si no tiene el código fuente de la prueba? – powder366

0

En realidad, encontré que hay una salida. De esta manera:

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 utilizar GetChild() para obtener instancia de la clase extendida.

+5

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 puedes cambiar la clase, es mucho mejor si configuras el constructor como protegido o público en primer lugar. –

Cuestiones relacionadas