Die Fehlermeldung „Variable, die im Lambda-Ausdruck verwendet wird, sollte endgültig oder tatsächlich endgültig sein“ erscheint, wenn versucht wird, eine nicht-finale Variable zu verwenden Variable innerhalb eines Lambda-Ausdrucks. Diese Anforderung stellt die Unveränderlichkeit der erfassten Variablen sicher.
Im bereitgestellten Codeausschnitt:
private TimeZone extractCalendarTimeZoneComponent(Calendar cal, TimeZone calTz) { ... cal.getComponents().getComponents("VTIMEZONE").forEach(component -> { ... if (calTz == null) { calTz = TimeZone.getTimeZone(v.getTimeZoneId().getValue()); } }); ... }
Die Variable calTz wird innerhalb des Lambda-Ausdrucks verwendet und hat keinen garantierten Endstatus. Dies verstößt gegen die Regel, dass Lambda-Ausdrücke nur Variablen erfassen können, die endgültig oder tatsächlich endgültig sind.
Warum gibt es diese Regel? Die Java Language Specification (JLS) erklärt in §15.27.2, dass sie den Zugriff auf sich dynamisch ändernde lokale Variablen verhindert und so Parallelitätsprobleme entschärft. Indem sichergestellt wird, dass erfasste Variablen unveränderlich sind, verringert die Sprache das Risiko von Fehlern.
Diese Anforderung gilt auch für anonyme innere Klassen. Variablen, die in solchen Klassen verwendet werden, müssen ebenfalls endgültig oder tatsächlich endgültig sein, um die Thread-Sicherheit zu gewährleisten.
Das obige ist der detaillierte Inhalt vonWarum erfordern Lambda-Ausdrücke finale oder effektiv finale Variablen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!