Java: Anonyme innere Klasse verwenden eine lokale variable
Wie bekomme ich den Wert von userId
übergeben, um diese Methode in meine anonyme innere Unterklasse hier?
public void doStuff(String userID) {
doOtherStuff(userID, new SuccessDelegate() {
@Override
public void onSuccess() {
Log.e(TAG, "Called delegate!!!! "+ userID);
}
});
}
Bekomme ich diesen Fehler:
Kann nicht beziehen sich auf eine nicht-Finale variable userID innerhalb einer inneren Klasse definiert, in eine andere Methode
Ich bin mir ziemlich sicher, ich kann nicht zuordnen, es als final, da es eine variable mit einem unbekannten Wert. Ich hatte gehört, dass diese syntax wird beibehalten, Umfang, so dass ich denke, es muss einen syntax-trick, ich weiß nicht ganz, noch nicht.
- schade, java erfordert Finale hier. es ist offensichtlich, compiler, dass die lokalen Variablen nicht geändert, es sollte nicht Fragen, coder, um zu bestätigen, dass. im Falle der anon-Klasse schreibt die lokale variable, die ein kompilieren Warnung genug. bad bad-design-Wahl.
- möglich, Duplikat der Warum sind nur final Variablen zugänglich in der anonymen Klasse?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sicher zuordnen können Sie es als final - legen Sie einfach das Schlüsselwort in die Deklaration der parameter:
Ich bin mir nicht sicher, was Sie gemeint es wird eine variable mit einem unbekannten Wert; alles, was final bedeutet, dass sobald ein Wert der Variablen zugewiesen, es kann nicht sein rezugeordnet. Da bist du nicht die änderung der Wert der userID innerhalb Ihrer Methode, es gibt kein problem, so dass es final in diesem Fall.
final
Erklärung funktioniert. Danke.Als jeder andere hier gesagt hat, lokale Variablen müssen final aufgerufen werden, indem Sie eine innere Klasse.
Hier ist (im Grunde), warum das so ist... wenn Sie den folgenden code schreiben (lange Antwort, aber an der Unterseite, Sie können Holen Sie sich die kurze version :-):
der compiler übersetzt es in etwa so:
und dann dies:
und schließlich zu diesem:
Wichtig ist, wo es fügt der Konstruktor $1. Stellen Sie, wenn Sie dies tun könnte:
Würden Sie erwarten, dass foo.bar() Drucke 1, aber es würde tatsächlich drucken 42. Indem die lokalen Variablen für die Letzte dieser verwirrenden situation kann nicht entstehen.
final
lokalen Variablen, die Sie verwendet, richtig? Keine Kopien von anderen lokalen (Finale oder nicht) - Variablen, dass es nicht direkt verwenden? Ich Frage, weil ich bin besorgt über Speicher-Lecks.Was ist das problem mit so dass es
final
wie inerklären die Methode
Muss der Wert endgültig sein, so dass der compiler sicher sein kann das nicht ändern. Dies bedeutet, dass der compiler binden können, die Wert auf die innere Klasse, jederzeit, ohne sich Gedanken über updates.
Der Wert ändert sich nicht in Ihrem code, so ist dies ein Sicheres ändern.
In Java 8, das hat sich ein wenig etwas geändert. Sie können jetzt auf Variablen zuzugreifen, sind effektiv final. Relevante snippets und Beispiel aus der Oracle-Dokumentation (Hervorhebung von mir):