Variable used in lambda expression should be final or effectively final
- 람다, 익명클래스는 다른 스레드에서 실행될 수 있다.
- 만약에 람다,익명클래스가 외부변수에 자유롭게 접근할수있다고 해보자.
- 그 람다/익명클래스를 만든 스택은 이미 사라지고 free변수도 사라졌는데, 람다/익명클래스는 그 지역변수를 계속해서 참조하려고 하는 에러가 발생한다.
- 따라서 , final 혹은 effectively final 인 외부변수에만 람다/익명객체는 접근할 수 있다.
-원래는 final키워드를 명시적으로 붙이는것이 맞으나 1.7부터는 컴파일러가 알아서 붙여준다고 한다.
-그러므로 - 결론적으로 :
- 람다/익명객체는 외부변수에 자유롭게 접근 가능하다.
- 그러나 지역변수의 경우 스택에 위치하므로, effectively final한 특성을 가지고 있어야 한다.
- 위 코드의 경우 effectively final 해야한다는 특성을 어겼으므로 컴파일러가 final키워드를 붙여서 처리해줄수없다. 따라서 에러가 난다.
댓글 없음:
댓글 쓰기