Prima di java 8 una classe interna poteva accedere agli oggetti esterni solo se erano dichiarati definitivi. Tuttavia ora quando eseguo il codice di esempio (dal basso) su javaSE 1.8 non ci sono errori di compilazione e il programma funziona correttamente.Le classi anonime possono accedere agli oggetti esterni non finali in java 8?
Perché l'hanno cambiato e come funziona ora?
codice di esempio da Java 7 tutorial:
public class MOuter {
private int m = (int) (Math.random() * 100);
public static void main(String[] args) {
MOuter that = new MOuter();
that.go((int) (Math.random() * 100), (int) (Math.random() * 100));
}
public void go(int x, final int y){
int a = x + y;
final int b = x - y;
class MInner{
public void method(){
System.out.println("m is "+m);
System.out.println("x is "+x); // supposedly illegal - 'x' not final
System.out.println("y is: "+y);
System.out.println("a is "+a); // supposedly illegal? - 'a' not final
}
}
MInner that = new MInner();
that.method();
}
}
Cosa ha detto JB. Ora è "efficacemente definitivo". È stato aggiunto per supportare meglio lambdas in Java 8 (che sono come chiusure ma un po 'diverse). – markspace
[Differenza tra finale ed efficacemente finale] (http://stackoverflow.com/questions/20938095/difference-between-final-and-effectively-final) – alex