method inner classes java final anonymous-class

inner - local class java



¿Qué significa una variable que es "efectivamente final"? (2)

Esta pregunta ya tiene una respuesta aquí:

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 .