Quando si accede a una variabile final
da una classe anonima, il compilatore copia segretamente il proprio valore in una variabile membro della classe anonima. ad esempio:
Runnable foo() {
final int x = 42;
return new Runnable() {
void run() {
System.out.writeln(x);
}
};
}
diventa:
// 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);
}
Se la variabile non fosse definitiva e sono stati autorizzati a cambiare, il valore memorizzato nella cache nell'istanza classe anonima potrebbe andare fuori sincrono. Ciò avrebbe potuto essere evitato con l'uso di una chiusura, ovvero di un oggetto contenente i valori di tutte le variabili locali, che accedono sia alla funzione originale che alla nuova istanza di classe anonima. .NET uses closures, for example. Tuttavia, questo può comportare un calo di prestazioni, e forse per questo motivo, i progettisti del linguaggio Java hanno deciso di non supportare chiusure complete.
Duplicato di http://stackoverflow.com/questions/1299837/cannot-refer-to-a-non-final-variable-inside-an-inner-class-defined-in-a-different (ma non di più voti ravvicinati) – skaffman