首頁 >Java >java教程 >為什麼 Java 要求 Lambda 表達式中的變數是最終變數或有效最終變數?

為什麼 Java 要求 Lambda 表達式中的變數是最終變數或有效最終變數?

Patricia Arquette
Patricia Arquette原創
2025-01-02 14:53:40556瀏覽

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

修正「lambda 表達式中使用的變數應該是最終的或有效最終的」錯誤

嘗試存取非最終時會發生此錯誤lambda 表達式中的變數。要解決這個問題,必須將變數宣告為final或有效final。

有效最終性

有效最終性意味著變數在初始化後不能重新分配。這可以透過以下方式實現:

  • 在外部作用域中將變數宣告為Final
  • 確保變數在lambda 中僅分配一次

為什麼要強制執行?

Java 語言規格(JLS)指出「對有效最終變數的限制禁止存取動態變更的局部變量,這些變數的擷取可能會引入並發問題。」透過強制執行此操作,Java 可以防止潛在的數據不一致和線程問題。

範例

考慮以下程式碼:

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;
}

calTz 變數是未宣告為最終的,導致錯誤。要修復此問題,我們可以修改程式碼如下:

private TimeZone extractCalendarTimeZoneComponent(Calendar cal, final TimeZone calTz) {
    ...
}

或者,我們可以確保calTz 在lambda 中僅分配給一次:

private TimeZone extractCalendarTimeZoneComponent(Calendar cal, TimeZone calTz) {
    ...
    if (calTz == null) {
        calTz = TimeZone.getTimeZone(v.getTimeZoneId().getValue());
    }
    ...
}

其他注意事項

此要求也適用於匿名內部類別。例如,以下程式碼也會導致錯誤:

new Thread(() -> {
    int i = 0; // Effectively final as it's only assigned once
    i++; // Error: cannot mutate effectively final variable
}).start();

透過強制執行這些規則,Java 有助於防止潛在的錯誤並提高多執行緒應用程式中的並發安全性。

以上是為什麼 Java 要求 Lambda 表達式中的變數是最終變數或有效最終變數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
上一篇:12 月 19 日下一篇:12 月 19 日