simple poo polimorfismo llamar herencia ejercicios ejemplos clase abstracta java class constructor classloader jls

java - poo - ¿Es siempre seguro llamar a getClass() dentro del constructor de la subclase?



polimorfismo java (3)

¿Llamar a getClass () dentro del constructor alguna vez nos dará problemas? Si es así, ¿cuáles son algunos ejemplos en los que llamar a getClass () dentro del constructor nos daría errores?

Usar getClass() en el constructor de esta manera siempre resultará en un error de compilación, ya que no se puede hacer referencia a esto antes de que se haya llamado a super() .

Main.java:17: error: cannot reference this before supertype constructor has been called super(getClass().getClassLoader()); // should not call getClass() because object ^ 1 error

Puede probarlo usted mismo en http://ideone.com/B0nYZ1 .

La Class está lista, pero la instancia no se puede usar para hacer referencia a la Class todavía.

Aún así, puedes usar la referencia de Class en el constructor, pero debes hacerlo de una manera ligeramente diferente: super(MyClassLoader.class.getClassLoader())

Además, tiene la libertad de usar getClass() en su constructor después de que se haya llamado al supertipo constructor. Como ya señaló, el objeto está básicamente listo después de eso y la referencia de Class se puede deducir de la instancia.

Un artículo sobre carga de clases indica que el método getClass() no debe llamarse dentro de un constructor porque:

La inicialización del objeto se completará solo a la salida del código del constructor.

El ejemplo que dieron fue:

public class MyClassLoader extends ClassLoader{ public MyClassLoader(){ super(getClass().getClassLoader()); // should not call getClass() because object // initialization will be complete only at // the exit of the constructor code. } }

Sin embargo, por lo que sé, el método final nativo getClass() siempre devolverá el objeto java.lang.Class de esa instancia de objeto, independientemente de dónde se llame (dentro del constructor o no).

¿ getClass() a getClass() dentro del constructor alguna vez nos dará problemas?

Si es así, ¿cuáles son algunos ejemplos en los que llamar a getClass() dentro del constructor nos daría errores?


La razón por la que no debe llamar a los métodos de clase padre, al menos en una invocación super (), es que dado que el objeto principal aún no se ha creado, no hay forma de saber si el método se ejecutará correctamente. Debe recordar que la llamada se produce antes de que los constructores principales tengan la oportunidad de preparar sus datos.

Después de una invocación super (), debería ser bastante seguro utilizar los métodos primarios, dentro de lo razonable, ya que los objetos primarios han terminado lo que necesitan para ser considerados listos para usar. Vi dentro de la razón porque los métodos de los padres pueden llamar a los métodos secundarios anulados que debe asegurarse de que sean seguros durante la construcción.

Inseguro:

public static class Base { public final void print() { System.out.println( this.get() ); } public int get() { return 2; } } public static final class Sub extends Base { private int x; public Sub() { super(); this.print(); this.x = 1; } public int get() { return this.x; } }

Seguro:

public static class Base { public final void print() { System.out.println( this.get() ); } public int get() { return 2; } } public static final class Sub extends Base { private int x; public Sub() { super(); this.x = 1; this.print(); } public int get() { return this.x; } }

Editar - Editar: después de volver a intentar el siguiente código y llamar a getClass (), en realidad no se compila. Por lo tanto, ignore por completo las declaraciones anteriores acerca de que Object.getClass () es el único método disponible para llamar antes de la inicialización principal. No tengo idea de cómo se perdió eso, y lamento cualquier confusión.


$ javac whose/MyClassLoader.java whose/MyClassLoader.java:5: error: cannot reference this before supertype constructor has been called super(getClass().getClassLoader()); ^ 1 error

Sé que es tarde en el día.