W jaki sposób pola nie-końcowe mogą być używane w anonimowej klasie, jeśli ich wartość może ulec zmianie?
Zadałem to pytanie wcześniej, ale nie otrzymałem odpowiedniej odpowiedzi.
W jaki sposób pola nie-końcowe mogą być używane w anonimowej klasie, jeśli ich wartość może ulec zmianie?
class Foo{
private int i;
void bar(){
i = 10
Runnable runnable = new Runnable (){
public void run (){
System.out.println(i); //works fine
}//end method run
}//end Runnable
}//end method bar
}//end class Foo
Jeśli lokalne zmienne używane w anonimowej klasie muszą byćfinal
aby umożliwić kompilatorowi wstawianie ich wartości do anonimowego kodu klasy w następujący sposób:
Przed:
public class Access1 {
public void f() {
final int i = 3;
Runnable runnable = new Runnable() {
public void run() {
System.out.println(i);
}//end method run
};//end anonymous class
}//end method f
}//end class Access1
Po:
public class Access1 {
public Access1() {}//end constructor
public void f() {
Access1$1 access1$1 = new Access1$1(this);
}//end method f
}//end class Access1
I
class Access1$1 implements Runnable {
Access1$1(Access1 access1) {
this$0 = access1;
}//end constructor
public void run() {
System.out.println(3);
}//end method run
private final Access1 this$0;
}//end class Access1$1
Następniew jaki sposób kompilator może wyznaczyć wartość pola innego niż końcowe?