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
Freigeben: 2025-01-02 14:53:40
Original
562 Leute haben es durchsucht

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;
}
Nach dem Login kopieren

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) {
    ...
}
Nach dem Login kopieren

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());
    }
    ...
}
Nach dem Login kopieren

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();
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage