Comme tout le monde l'a dit, les variables locales doivent être finales pour être accessibles par une classe interne.
Voici (en gros) pourquoi est ... si vous écrivez le code suivant (réponse longue, mais, au fond, vous pouvez obtenir la version courte :-):
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();
}
}
le compilateur il se traduit à peu près comme ceci:
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();
}
}
puis ceci:
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);
}
}
}
et enfin à ceci:
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);
}
}
L'important est où il ajoute le constructeur à 1 $. Imaginez si vous pouviez le faire:
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 vous attendez que foo.bar() serait imprimer 1, mais il fait imprimer 42. En exigeant des variables locales à être définitive cette situation confuse ne peut pas se produire.
trop mauvais java nécessite final ici. il est évident de compiler que la variable locale n'est pas changée, il ne faut pas demander au codeur de la confirmer. dans le cas où la classe anon écrit dans la variable locale, un avertissement de compilation suffit. mauvais mauvais choix de conception. – irreputable
duplicata possible de [Pourquoi seules les variables finales sont-elles accessibles en classe anonyme?] (Http://stackoverflow.com/questions/4732544/why-are-only-final-variables-accessible-in-anonymous-class) – vaxquis