修复“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中文网其他相关文章!