Heim >Java >javaLernprogramm >Warum müssen Variablen in Lambda-Ausdrücken endgültig oder tatsächlich endgültig sein?
Warum unveränderliche Variablen in Lambda-Ausdrücken erforderlich sind
Der Fehler „Variable, die in Lambda-Ausdrücken verwendet wird, sollte endgültig oder effektiv endgültig sein“ tritt auf, wenn a Die in einem Lambda-Ausdruck verwendete Variable ist nicht endgültig oder effektiv endgültig. Um diese Anforderung zu verstehen, 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; }
In diesem Code wird die Variable „calTz“ innerhalb des Lambda-Ausdrucks verwendet, der über Komponenten eines Kalenderobjekts iteriert. Allerdings wird „calTz“ nicht als „final“ deklariert und ist auch nicht effektiv final (d. h. es kann später im Code geändert werden).
Gemäß der Java Language Specification (JLS) §15.27.2, Von Lambda-Ausdrücken erfasste Variablen müssen effektiv endgültig sein. Dies bedeutet, dass die Variable nach der Erfassung durch das Lambda nicht mehr geändert werden darf. Der Grund für diese Einschränkung besteht darin, Parallelitätsprobleme zu verhindern, die auftreten können, wenn mehrere Threads auf die erfasste Variable zugreifen und diese möglicherweise ändern.
Um den Fehler zu beheben, können Sie den Code ändern, um sicherzustellen, dass die Variable „calTz“ endgültig ist oder effektiv endgültig. Eine Möglichkeit, dies zu tun, besteht darin, „calTz“ als endgültig zu deklarieren:
private TimeZone extractCalendarTimeZoneComponent(Calendar cal, final TimeZone calTz) { // ... }
Alternativ können Sie „calTz“ effektiv endgültig machen, indem Sie ihm sofort einen Wert zuweisen und sicherstellen, dass der Wert später nicht geändert wird Code:
private TimeZone extractCalendarTimeZoneComponent(Calendar cal) { TimeZone calTz = null; try { // ... } catch (Exception e) { // ... } return calTz; }
Indem Sie die Anforderung befolgen, dass in Lambda-Ausdrücken verwendete Variablen endgültig oder effektiv endgültig sein müssen, können Sie potenzielle Parallelitätsprobleme vermeiden und die Korrektheit Ihres Codes sicherstellen Code.
Das obige ist der detaillierte Inhalt vonWarum müssen Variablen in Lambda-Ausdrücken endgültig oder tatsächlich endgültig sein?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!