Như mọi người khác ở đây đã nói, biến cục bộ phải là cuối cùng để được truy cập bởi một lớp bên trong.
Dưới đây là (cơ bản) tại sao đó là ... nếu bạn viết đoạn code sau (câu trả lời dài, nhưng, ở phía dưới, bạn có thể nhận được phiên bản ngắn :-):
class Main
{
private static interface Foo
{
void bar();
}
public static void main(String[] args)
{
final int x;
Foo foo;
x = 42;
foo = new Foo()
{
public void bar()
{
System.out.println(x);
}
};
foo.bar();
}
}
trình biên dịch dịch nó gần như thế này:
class Main
{
private static interface Foo
{
void bar();
}
public static void main(String[] args)
{
final int x;
Foo foo;
x = 42;
class $1
implements Foo
{
public void bar()
{
System.out.println(x);
}
}
foo = new $1();
foo.bar();
}
}
và sau đó này:
class Main
{
private static interface Foo
{
void bar();
}
public static void main(String[] args)
{
final int x;
Foo foo;
x = 42;
foo = new $1(x);
foo.bar();
}
private static class $1
implements Foo
{
private final int x;
$1(int val)
{
x = val;
}
public void bar()
{
System.out.println(x);
}
}
}
và cuối cùng là như thế này:
class Main
{
public static void main(String[] args)
{
final int x;
Main$Foo foo;
x = 42;
foo = new Main$1(x);
foo.bar();
}
}
interface Main$Foo
{
void bar();
}
class Main$1
implements Main$Foo
{
private final int x;
Main$1(int val)
{
x = val;
}
public void bar()
{
System.out.println(x);
}
}
Điều quan trọng là nơi nó thêm hàm tạo vào $ 1. Hãy tưởng tượng nếu bạn có thể làm điều này:
class Main
{
private static interface Foo
{
void bar();
}
public static void main(String[] args)
{
int x;
Foo foo;
x = 42;
foo = new Foo()
{
public void bar()
{
System.out.println(x);
}
};
x = 1;
foo.bar();
}
}
Bạn mong chờ rằng foo.bar() sẽ in ra 1 nhưng nó thực sự sẽ in ra 42. Bằng cách yêu cầu các biến địa phương được chính thức tình huống khó hiểu này không thể xảy ra.
java quá xấu yêu cầu cuối cùng ở đây. rõ ràng là trình biên dịch rằng biến cục bộ không bị thay đổi, nó không nên yêu cầu người lập trình xác nhận điều đó. trong trường hợp lớp anon ghi vào biến cục bộ, một cảnh báo biên dịch là đủ. lựa chọn thiết kế xấu xấu. – irreputable
có thể trùng lặp của [Tại sao chỉ các biến cuối cùng có thể truy cập trong lớp ẩn danh?] (Http://stackoverflow.com/questions/4732544/why-are-only-final-variables-accessible-in-anonymous-class) – vaxquis