>Java >java지도 시간 >람다 표현식의 변수가 최종 또는 사실상 최종이어야 하는 이유는 무엇입니까?

람다 표현식의 변수가 최종 또는 사실상 최종이어야 하는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-22 21:00:13618검색

Why Must Variables in Lambda Expressions Be Final or Effectively Final?

람다 표현식에 불변 변수가 필요한 이유

"람다 표현식에 사용된 변수는 최종 또는 사실상 최종이어야 합니다." 오류는 다음과 같은 경우에 발생합니다. 람다 식 내에서 사용된 변수는 최종이 아니거나 사실상 최종이 아닙니다. 이 요구 사항을 이해하려면 다음 코드를 고려하십시오.

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.