비최종 표현식을 사용하려고 하면 "람다 표현식에 사용된 변수는 최종 또는 사실상 최종이어야 합니다"라는 오류 메시지가 발생합니다. 람다 표현식 내의 변수. 이 요구 사항은 캡처된 변수의 불변성을 보장합니다.
제공된 코드 조각에서:
private TimeZone extractCalendarTimeZoneComponent(Calendar cal, TimeZone calTz) { ... cal.getComponents().getComponents("VTIMEZONE").forEach(component -> { ... if (calTz == null) { calTz = TimeZone.getTimeZone(v.getTimeZoneId().getValue()); } }); ... }
calTz 변수는 람다 식 내에서 사용되며 최종 상태가 보장되지 않습니다. 이는 람다 표현식이 최종이거나 사실상 최종인 변수만 캡처할 수 있다는 규칙을 위반합니다.
이 규칙이 적용되는 이유는 무엇인가요? JLS(Java 언어 사양)는 §15.27.2에서 동적으로 변경되는 지역 변수에 대한 액세스를 방지하여 동시성 문제를 완화한다고 설명합니다. 캡처된 변수를 변경할 수 없도록 보장함으로써 언어는 버그 위험을 낮춥니다.
이 요구 사항은 익명 내부 클래스에도 적용됩니다. 이러한 클래스 내에서 사용되는 변수는 스레드 안전성을 보장하기 위해 final이거나 사실상 final이어야 합니다.
위 내용은 람다 표현식에 최종 또는 사실상 최종 변수가 필요한 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!