修正「lambda 表達式中使用的變數應該是最終的或有效最終的」錯誤
嘗試存取非最終時會發生此錯誤lambda 表達式中的變數。要解決這個問題,必須將變數宣告為final或有效final。
有效最終性
有效最終性意味著變數在初始化後不能重新分配。這可以透過以下方式實現:
為什麼要強制執行?
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中文網其他相關文章!