Cuando accede a una variable final
de una clase anónima, el compilador copia secretamente su valor en una variable miembro de la clase anónima. por ejemplo:
Runnable foo() {
final int x = 42;
return new Runnable() {
void run() {
System.out.writeln(x);
}
};
}
se convierte en:
// the actual name is generally illegal in normal java syntax
class internal_Runnable implements Runnable {
final int x;
internal_Runnable(int _x) { x = _x; }
void run() {
System.out.writeln(x);
}
}
void foo() {
final x = 42;
return new internal_Runnable(x);
}
Si la variable no eran definitivas y se les permitió cambiar, el valor almacenado en caché en la instancia de clase anónimo podría ir fuera de sincronización. Esto podría haberse evitado mediante el uso de un cierre, es decir, un objeto que contenga los valores de todas las variables locales, al que acceden tanto la función original como la nueva instancia de clase anónima. .NET uses closures, for example. Sin embargo, esto puede incurrir en un golpe de rendimiento, y tal vez por esa razón, los diseñadores de lenguaje de Java decidieron no admitir cierres completos.
Duplicado de http://stackoverflow.com/questions/1299837/cannot-refer-to-a-non-final-variable-inside-an-inner-class-defined-in-a-different (pero no más cerrar votos) – skaffman