Sie haben hier eine innere Klasse erstellt. Da die Lebensdauer von Objekten dieser Klasse möglicherweise viel größer sein kann als die Laufzeit des Methodenaufrufs (dh das Objekt kann noch lange nach der Rückkehr der Methode existieren), muss es den Zustand der lokalen Variablen, die es enthält, "bewahren" kann zugreifen.
Dieses Einsparen erfolgt durch Erstellen einer (unsichtbaren, synthetischen) Kopie innerhalb der inneren Klasse und automatischem Ersetzen aller Verweise auf die lokale Variable durch Verweise auf diese Kopie. Diese könnte zu seltsamen Effekten führen, wenn die lokale Variable nach der Erstellung des inneren Klassenobjekts geändert wurde.
Um dies zu vermeiden, müssen alle lokalen Variablen, auf die Sie zugreifen, final
sein. Dies stellt sicher, dass es nur einen möglichen Wert für die lokale Variable gibt und keine Inkonsistenzen beobachtet werden.
Diese spezifische Regel finden Sie in §8.1.3 Innere Klassen und umschließende Elemente Instanzen von der JLS :
Jede lokale Variable, jeder formale Methodenparameter oder Ausnahmehandler-Parameter, der in einer inneren Klasse verwendet, aber nicht deklariert wurde, muss als final deklariert werden. Jede lokale Variable, die in einer inneren Klasse verwendet, aber nicht deklariert wurde, muss definitiv zugewiesen werden (§ 16) vor dem Körper der inneren Klasse.
Hier erstellen Sie eine innere Klasse. Um auf den Kontext der Ausführung zuzugreifen, sollten die Verweise auf die Variablen intakt bleiben, ansonsten wird ein Fehlerverhalten beobachtet. Um dies zu gewährleisten, sollten Sie Ihre Variable endgültig deklarieren: Sie kann also nicht geändert werden.
Siehe detaillierte Erklärung hier .
Von Kathy Sierra scjp Buch
Die lokalen Variablen der Methode leben auf dem Stack und existieren nur für die Lebensdauer der Methode. Wir wissen bereits, dass der Gültigkeitsbereich einer lokalen Variablen auf die Methode beschränkt ist, in der die Variable deklariert ist. Wenn die Methode endet, wird der Stack-Frame weggeblasen und die Variable ist Geschichte. Aber auch nach Abschluss der Methode ist das darin erstellte innere Klassenobjekt möglicherweise noch auf dem Heap vorhanden, wenn z. B. ein Verweis auf einen anderen Code übergeben und dann in einer Instanzvariable gespeichert wurde. Da für die lokalen Variablen nicht sichergestellt ist, dass sie am Leben sind, solange das interne Methodenklassenklassenobjekt vorhanden ist, kann das innere Klassenobjekt diese nicht verwenden. Es sei denn, die lokalen Variablen sind als endgültig gekennzeichnet!
Sie haben also eine lokale finale Variable und eine Methode lokale innere Klasse. Eine Methode-lokale innere Klasse kann nicht-endliche Variablen nicht verwenden, die in der Methode deklariert wurden (einschließlich der Parameter).
Um tiefer hineinzugehen: Die Methode-local innere Klasse kann nur innerhalb der Methode instanziiert werden, in der die Klasse definiert ist. Die lokalen Variablen leben für die Lebensdauer der Methode im Stapel. Wenn die Methode endet, verschwinden die lokalen Variablen, jedoch bleibt das erzeugte innere Klassenobjekt erhalten.
Es ist eine Frage der Lebensdauer / Reichweite.