inner - local class java
¿Qué significa una variable que es "efectivamente final"? (2)
Esta pregunta ya tiene una respuesta aquí:
- Diferencia entre final y efectivamente 13 respuestas finales
La documentation sobre Clases Anónimas establece
Una clase anónima no puede acceder a las variables locales en su ámbito que no se declaran como final o efectivamente final.
No entiendo qué significa una variable que sea "final efectiva". ¿Puede alguien proporcionar un ejemplo para ayudarme a entender lo que eso significa?
Efectivamente final significa que nunca se cambia después de obtener el valor inicial.
Un ejemplo simple:
public void myMethod() {
int a = 1;
System.out.println("My effectively final variable has value: " + a);
}
Aquí, a
no se declara final, pero se considera efectivamente final ya que nunca se cambia.
A partir de Java 8, esto se puede utilizar de la siguiente manera:
public void myMethod() {
int a = 1;
Runnable r = new Runnable() {
@Override
public void run() {
System.out.println("My effectively final variable has value: " + a);
}
};
}
En Java 7 y versiones anteriores, a
tenía que ser declarada final
para poder usarse en una clase local como esta, pero desde Java 8 es suficiente para que sea efectivamente definitiva.
Según los docs :
Una variable o parámetro cuyo valor nunca se cambia después de que se inicializa es effectively final
.