Khi bạn truy cập biến số final
từ một lớp ẩn danh, trình biên dịch sẽ sao chép bí mật giá trị của chúng vào một biến thành viên của lớp ẩn danh. ví dụ:
Runnable foo() {
final int x = 42;
return new Runnable() {
void run() {
System.out.writeln(x);
}
};
}
trở thành:
// 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);
}
Nếu biến là không chính thức và được phép thay đổi, giá trị cache trong trường hợp lớp nặc danh có thể đi ra ngoài đồng bộ. Điều này có thể tránh được bằng cách sử dụng một bao đóng - đó là, một đối tượng giữ các giá trị của tất cả các biến cục bộ, cả hàm gốc và truy cập cá thể lớp ẩn danh mới. .NET uses closures, for example. Tuy nhiên, điều này có thể gây ra một hit hiệu suất, và có lẽ vì lý do đó, các nhà thiết kế ngôn ngữ Java quyết định không hỗ trợ đóng cửa đầy đủ.
Bản sao của http://stackoverflow.com/questions/1299837/cannot-refer-to-a-non-final-variable-inside-an-inner-class-defined-in-a-different (nhưng không còn đóng phiếu) – skaffman