Behebung des Fehlers „Variable, die im Lambda-Ausdruck verwendet wird, sollte endgültig oder tatsächlich endgültig sein“
Dieser Fehler tritt auf, wenn versucht wird, auf eine nicht endgültige Variable zuzugreifen Variable innerhalb eines Lambda-Ausdrucks. Um es aufzulösen, muss die Variable als final oder effektiv final deklariert werden.
Effektive Finalität
Effektive Finalität bedeutet, dass die Variable nach der Initialisierung nicht neu zugewiesen werden kann. Dies kann erreicht werden durch:
Warum wird dies erzwungen?
In der Java Language Specification (JLS) heißt es: „Die Beschränkung auf effektiv „Final Variables“ verbietet den Zugriff auf sich dynamisch ändernde lokale Variablen, deren Erfassung wahrscheinlich zu Parallelitätsproblemen führen würde.“ Indem Java dies erzwingt, verhindert es potenzielle Dateninkonsistenzen und Threading-Probleme.
Beispiel
Betrachten Sie den folgenden Code:
private TimeZone extractCalendarTimeZoneComponent(Calendar cal, TimeZone calTz) { try { cal.getComponents().getComponents("VTIMEZONE").forEach(component -> { VTimeZone v = (VTimeZone) component; v.getTimeZoneId(); if (calTz == null) { calTz = TimeZone.getTimeZone(v.getTimeZoneId().getValue()); } }); } catch (Exception e) { log.warn("Unable to determine ical timezone", e); } return null; }
Die Variable calTz ist nicht als endgültig deklariert, was zu dem Fehler führte. Um das Problem zu beheben, können wir den Code wie folgt ändern:
private TimeZone extractCalendarTimeZoneComponent(Calendar cal, final TimeZone calTz) { ... }
Alternativ können wir sicherstellen, dass calTz nur einmal innerhalb des Lambda zugewiesen wird:
private TimeZone extractCalendarTimeZoneComponent(Calendar cal, TimeZone calTz) { ... if (calTz == null) { calTz = TimeZone.getTimeZone(v.getTimeZoneId().getValue()); } ... }
Zusätzliche Überlegungen
Diese Anforderung gilt auch für anonyme Innenkurse. Beispielsweise würde auch der folgende Code den Fehler verursachen:
new Thread(() -> { int i = 0; // Effectively final as it's only assigned once i++; // Error: cannot mutate effectively final variable }).start();
Durch die Durchsetzung dieser Regeln trägt Java dazu bei, potenzielle Fehler zu verhindern und fördert die Parallelitätssicherheit in Multithread-Anwendungen.
Das obige ist der detaillierte Inhalt vonWarum verlangt Java, dass Variablen in Lambda-Ausdrücken endgültig oder tatsächlich endgültig sind?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!