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 One
que 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?
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 claseTest
debe ser estático. De lo contrario, no es posible realizar una llamada comoTest.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 detest
) - Sugiero hacer el
One
constructor deprivate
a menos que se llame desde una clase diferente en el mismo paquete
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