¿Por qué cuando utilizo referencia this
en una declaración de variables, no aparece referencia ilegal hacia adelante? ¿Cuál es la diferencia entre la declaración con this
y sin ella?
El siguiente ejemplo falla al compilar debido a la referencia ilegal hacia adelante:
class FailsToCompile {
int a = b; //illegal forward reference
int b = 10;
}
Al calificar el uso de b
por this
el error de compilación desaparece.
class Compiles {
int a = this.b; //that's ok
int b = 10;
}
Suponiendo que la siguiente clase de
public class MyClass {
int a = b;
int b = 10;
}
El JLS 8.3.3. establece en su caso:
El uso de variables de instancia cuyas declaraciones aparecerá textualmente después del uso se restringe a veces
- El uso es un nombre simple en ya sea una variable de instancia inicializador de C o una instancia inicializador de C
Ahora, utilizando el miembro this
le permite acceder a una instancia que ya se declaró con valores por defecto ( a = 0, b = 0
), pero aún no inicializado completamente. Esto es visible si se comprueba el resultado de:
public class MyClass {
int a = this.b;
int b = 10;
}
No se puede obtener el valor esperado:
new MyClass().a //0
new MyClass().b //10
No puedo explicar por qué esto es legal exactamente ya que este nunca se daría un valor correcto. Podemos encontrar alguna explicación acerca de por qué existe la restricción:
Las restricciones anteriormente están diseñados para la captura, en tiempo de compilación, inicializaciones circulares o malformadas lo contrario.
Pero ¿por qué permitir this
a las obras ...
Sabiendo que durante una inicialización de una instancia, las acciones siguientes:
- declaración de miembro
- ejecución del bloque y la inicialización de campo con el fin
- constructor de ejecución
Dar un comportamiento extraño:
public class MyClass {
{
b = 10;
}
int a = this.b;
int b = 5;
{
b = 15;
}
public static void main(String[] args) {
MyClass m = new MyClass();
System.out.println(m.a); //10
System.out.println(m.b); //15
}
}
Me limitar la inicialización en el constructor.