Como todos los demás aquí han dicho, las variables locales tienen que ser definitivas para acceder a una clase interna.
Aquí es (básicamente) por qué es así ... si se escribe el siguiente código (respuesta larga, pero, en el fondo, se puede obtener la versión corta :-):
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();
}
}
el compilador lo traduce más o menos así:
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();
}
}
y luego esto:
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);
}
}
}
y finalmente a esto:
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);
}
}
Lo importante es que agrega el constructor a $ 1. Imagínese si usted puede hacer esto:
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();
}
}
que se puede esperar que foo.bar() imprimiría 1 pero sería realmente imprimir 42. Al exigir que las variables locales a ser definitiva esta confusa situación no puede surgir.
lástima Java requiere última aquí. es obvio para el compilador que la variable local no se cambia, no debe pedirle al codificador que lo confirme. en caso de que la clase anon escriba en la variable local, una advertencia de compilación es suficiente. mala mala elección de diseño. – irreputable
posible duplicado de [¿Por qué solo las variables finales son accesibles en la clase anónima?] (Http://stackoverflow.com/questions/4732544/why-are-only-final-variables-accessible-in-anonymous-class) – vaxquis