Der lokale Variablenzugriff auf die innere Klasse muss als final deklariert werden

7

Ich habe ein Problem mit lokalen Variablen Zugriff auf innere Klasse muss endgültig erklärt werden. Es stammt von der Methode createGrids () - & gt; " squares[i][j] = 0; ", dass i eine lokale Variable ist, die als final deklariert werden muss. Ich weiß nicht warum und ich habe das letzte in Feldern hinzugefügt, aber es funktioniert nicht so gut.

%Vor%

// weggelassen

%Vor%     
yoadle 19.12.2014, 01:13
quelle

2 Antworten

20

Anonyme innere Klassen haben Zugriff auf lokale Variablen durch einen Trick hinter den Kulissen. Lokale Variablen werden als versteckte Member-Variablen der inneren Klasse implementiert. Sie sind Kopien der lokalen Variablen zugewiesen. Um zu verhindern, dass der Kopierwert falsch ist, erzwingt der Java-Compiler, dass diese lokalen Variablen final sein müssen, damit sie nicht geändert werden, damit die Kopie korrekt bleibt.

Die Felder der einschließenden Klasse müssen nicht final sein; Die verwendeten lokalen Variablen müssen final sein. Sie müssen alle lokalen Variablen in Ihrer anonymen inneren Klasse final verwenden. Sie können dies tun, indem Sie die final -Variablen für Ihre Werte i und j initialisieren und sie in Ihrer anonymen inneren Klasse verwenden.

%Vor%

Beachten Sie, dass dies in Java 8 nicht erforderlich wäre, da der Java 8-Compiler erkennen kann, ob die in anonymen inneren Klassen verwendeten lokalen Variablen "effektiv final" sind, also nicht final , aber nach der Initialisierung nie geändert wurden.

    
rgettman 19.12.2014, 01:26
quelle
4

In diesem Fall erstellen Sie 81 ActionListener-Klassen, jede mit ihrer eigenen Methode actionPerformed . Aber wenn diese Methode ausgeführt wird, weiß die Klasse nicht, was der Wert von i und j mehr ist, da sie sie weit zurückgelassen hat.

Java verhindert dies, daher der Compilerfehler. Es erfordert, dass alle referenzierten lokalen Variablen endgültig sind, damit sie an die erstellten Klassen übergeben werden können.

Der einfachste Weg, dies zu lösen, ist ein Paar final Variablen innerhalb Ihrer Schleifen zu erstellen:

%Vor%     
Michael Myers 19.12.2014 01:26
quelle

Tags und Links