티스토리 뷰

반응형

Local variable userId defined in an enclosing scope must be final or effectively final

long userId = -1;
if(...){
	userId = updateUser();
}else{
	userId = insertUser();
}
userList.removeIf(t->t.getUserID()==userId);

위처럼 람다식을 사용하려다가 에러가 났다. removeIf 안의 userId변수가 final 이거나 effectively final이여야 한다고 한다.

 

이유를 찾아보았다.

람다식에서는 다른 스레드에서 호출될때 변수가 스택영역에서 사라질것을 대비하여 자유변수의 복사본을 만들어 접근을 허용하도록 하게 한다. 이를 람다 캡쳐링(capturing lambda)라고 한다.

 

람다 캡쳐링을 하고 나서 변수가 변경되면 자유 변수 참조 값의 동기(Sync)를 맞출수 없다.

그래서 final을 쓰도록 컴파일러가 컴파일 에러를 낸다.

 

결국, 위 코드는 아래처럼 if문 안에 람다식을 넣어 final 변수를 이용하긴 했지만, 마음에 들지는 않는다....

if(...){
	final long userId = updateUser();
    userList.removeIf(t->t.getUserID()==userId);
}else{
	final long userId = insertUser();
    userList.removeIf(t->t.getUserID()==userId);
}

 좀 더 적합한 방법을 찾아봐야겠다...

  

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함