Heim >Java >javaLernprogramm >Warum verlangt Java, dass Variablen in Lambda-Ausdrücken endgültig oder tatsächlich endgültig sind?

Warum verlangt Java, dass Variablen in Lambda-Ausdrücken endgültig oder tatsächlich endgültig sind?

Patricia Arquette
Patricia ArquetteOriginal
2025-01-02 14:53:40583Durchsuche

Why Does Java Require Variables in Lambda Expressions to Be Final or Effectively Final?

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:

  • Deklarieren der Variablen als final im äußeren Bereich
  • Sicherstellen, dass die Variable nur einmal innerhalb des Lambda zugewiesen wird

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:TAG 19. DezNächster Artikel:TAG 19. Dez