innere Klasse nicht endgültige Variable Java

8

Ich musste die Variablen in einer inneren Klasse ändern und erhielt den berüchtigten Fehler "Kann nicht auf eine nicht-finale Variable in einer inneren Klasse verweisen, die in einer anderen Methode definiert wurde".

%Vor%

Ich machte schnell einen Kurs, der all die Dinge enthielt, die ich ändern wollte, und machte eine endgültige Version der Klasse außerhalb der inneren Klasse

%Vor%

Dies scheint zu sein, was ich brauche und es funktioniert, aber ich frage mich, ob das das Problem richtig umgehen kann. Außerdem hasse ich wirklich das Wort temp , um meine Klasse zu benennen. Gibt es einen tatsächlichen Programmierbegriff für das, was ich getan habe, damit ich einen aussagekräftigeren Namen für meine Klasse erstelle?

    
Aaron Greenberg 03.07.2012, 18:26
quelle

4 Antworten

9

Sie können einfach eine innere Klasse anstelle einer anonymen Klasse erstellen (wie Sie es gerade tun). Dann haben Sie einen Konstruktor und andere Methoden, die Sie Ihren Mitgliedern zuweisen möchten. Kein Hacking erforderlich (wie das Array von 1 Fall).

Ich finde das sauberer, wenn die Klasse einen Datenaustausch mit ihrer äußeren Klasse erfordert, aber gebe zu, dass es eine persönliche Präferenz ist. Die Reihe von 1 Idiom wird auch funktionieren und ist knapper, aber ehrlich gesagt, es sieht einfach fugig aus. Normalerweise beschränke ich anonyme innere Klassen auf solche, die nur Aktionen ausführen, ohne zu versuchen, Daten in der äußeren Klasse zu aktualisieren.

Zum Beispiel:

%Vor%

Wenn mehrere Threads beteiligt sind, muss auch eine entsprechende Synchronisation verwendet werden.

    
Robin 03.07.2012, 19:23
quelle
2

Ich habe eine ähnliche Antwort in meinem anderer Thread hier . Grundsätzlich besteht die Idee darin, einen "Wrapper" zu erstellen, der nahezu jeden Object -Typ umschließt. Da final in Java für "keine Neuzuweisung" und nicht "konstant" steht, funktioniert dieser Trick ziemlich gut. Aber wie bereits im Originalbeitrag erwähnt, sollten Sie bei der Verwendung in einer Umgebung mit mehreren Threads vorsichtig vorgehen.

    
Sanjay T. Sharma 03.07.2012 18:30
quelle
0

Ich würde einen Verweis auf Ihren On-Click-Listener in der äußeren Klasse behalten und das int zu einer Mitgliedsvariablen in Ihrem Listener machen. Speichern Sie die Variable einfach im Listener beim Klicken, und greifen Sie dann bei Bedarf in die äußere Klasse, anstatt sie an der Stelle des Klicks festzulegen.

Um es einfach auszudrücken, wenn die innere Klasse es ändern muss, machen Sie es zu einer Variablen in der inneren Klasse.

    
Rob Trickey 03.07.2012 19:31
quelle
0

Da Sie anscheinend mehrere Dinge einstellen (aus den Kommentaren), erstellen Sie eine Methode in der Hauptklasse, button1WasClicked() , (ein besserer Name könnte doUpdate, doSave usw. sein - etwas, was für die Schaltfläche relevant ist), Setze dort den richtigen Code ein und nenne ihn von der inneren Klasse / Hörer. (Wenn Sie Swing verwenden, würde ich es zu einer Aktion machen, YMMV)

Wenn später ein Menü oder eine Absicht oder eine Geste vorhanden ist, die dasselbe Zeug ausführen müssen, ist der Anruf da.

    
user949300 03.07.2012 19:43
quelle