"Kann nicht auf eine nicht endgültige Variable innerhalb einer inneren Klasse verweisen, die in einer anderen Methode definiert wurde" Problem [duplizieren]

7

Ich kann die Variable "i" in der Methode run () nicht verwenden.  Gibt es einen Weg, es zu tun?

%Vor%     
user2976091 10.11.2013, 12:15
quelle

4 Antworten

22

Sie können eine final Variable p deklarieren, die bei jeder Iteration den Wert von i annimmt.

%Vor%

Warum muss ich eine Abschlusserklärung haben?

    
Alexis C. 10.11.2013, 12:17
quelle
8

Das stimmt. Es ist eine Einschränkung der inneren Klassen von Java! Eine innere Klasse darf nicht auf eine Instanzvariable in einem umschließenden Bereich zugreifen, es sei denn, diese Variable wird als final deklariert.

Sie müssen diesen Code also so implementieren ...

%Vor%

Der Grund für diese Einschränkung besteht darin, zu vermeiden, dass Java closures implementiert. Da ii endgültig ist, kann der Compiler das Obige implementieren, indem er eine Kopie des Wertes von ii an die anonyme innere Klasse übergibt, wenn diese instanziiert wird. Dies wird in einer versteckten Variablen gespeichert ..., so dass es verwendet werden kann, nachdem der umschließende Methodenaufruf abgeschlossen ist.

Ohne diese Einschränkung müsste ein (hypothetischer) Java-Compiler ein Heap-Objekt erstellen, das die Variable i enthält. (Oder zumindest, wenn es das Objekt nicht optimieren könnte ...) Genau darum geht es bei closures auf der Implementierungsebene.

Der andere Punkt, den Menschen manchmal übersehen, ist, dass dieser bestimmte Algorithmus falsch wäre, wenn Java Ihnen den Zugriff auf das nicht-endgültige i ermöglicht. Warum? Weil zu dem Zeitpunkt, zu dem die Threads tatsächlich gestartet wurden, die äußere Schleife höchstwahrscheinlich beendet sein würde und die Threads alle i mit dem Wert N sehen würden. Das ist NICHT das, was Sie hier erreichen wollen.

UPDATE beginnend mit Java 8 muss die äußere Instanzvariable nur effektiv final sein.

    
Stephen C 10.11.2013 12:19
quelle
3

Versuchen Sie:

%Vor%     
Jean Logeart 10.11.2013 12:18
quelle
3

Dies ist die Einschränkung der inneren Klasse von Java, da Java keine echten Sperren

unterstützt

Sehen Sie sich auch dieses Kann nicht auf eine nicht endgültige Variable innerhalb einer inneren Klasse verweisen, die in einer anderen Methode definiert wurde für Details.

Sie können so versuchen:

%Vor%     
Rahul Tripathi 10.11.2013 12:20
quelle

Tags und Links