람다 표현식에 불변 변수가 필요한 이유
"람다 표현식에 사용된 변수는 최종 또는 사실상 최종이어야 합니다." 오류는 다음과 같은 경우에 발생합니다. 람다 식 내에서 사용된 변수는 최종이 아니거나 사실상 최종이 아닙니다. 이 요구 사항을 이해하려면 다음 코드를 고려하십시오.
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' 변수는 Calendar 개체의 구성 요소를 반복하는 람다 식 내에서 사용됩니다. 그러나 'calTz'는 'final'로 선언되지 않았으며 사실상 final이 아닙니다(즉, 나중에 코드에서 수정될 수 있음).
JLS(Java 언어 사양) §15.27.2에 따르면, 람다 식으로 캡처된 변수는 사실상 최종이어야 합니다. 이는 변수가 람다에 의해 캡처된 후에 수정되어서는 안 된다는 것을 의미합니다. 이러한 제한을 적용하는 이유는 여러 스레드가 액세스할 때 발생할 수 있는 동시성 문제를 방지하고 캡처된 변수를 수정할 수 있기 때문입니다.
오류를 해결하려면 'calTz' 변수가 최종 변수가 되도록 코드를 수정하면 됩니다. 또는 사실상 최종적입니다. 이를 수행하는 한 가지 방법은 'calTz'를 최종으로 선언하는 것입니다.
private TimeZone extractCalendarTimeZoneComponent(Calendar cal, final TimeZone calTz) { // ... }
또는 'calTz'에 즉시 값을 할당하고 나중에 값이 변경되지 않도록 하여 효과적으로 최종으로 만들 수 있습니다. 코드:
private TimeZone extractCalendarTimeZoneComponent(Calendar cal) { TimeZone calTz = null; try { // ... } catch (Exception e) { // ... } return calTz; }
람다 식에 사용되는 변수가 final이거나 사실상 final이어야 한다는 요구 사항을 따르면 잠재적인 동시성 문제를 방지하고 코드가 정확해야 합니다.
위 내용은 람다 표현식의 변수가 최종 또는 사실상 최종이어야 하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!