2014-11-03 2 views
0

final 또는 effectively final 인 지역 변수의 차이점은 here입니다. 나는 정말로 이해하지 못한다. 왜 자바 8에서 소개 되었는가? 프로그래머에게 final 키워드를 생략 할 수있는 자유를주는 것처럼 보이지만 변수를 효과적으로 최종적으로 다루는 것처럼 보인다. 로직 변경이 없으며 '게으른' 프로그래머에게는 도우미가 없으므로 final을 작성하십시오.왜 Java 8에서 '효과적으로 최종'이 도입 되었습니까?

변수가 효과적으로 최종적으로 키워드를 놓치고 코드의 독자에게 나타내지 않기 때문에 단계적으로 복귀하지 않습니까? 오라클이 여기에서 최종 키워드를 생략 할 수있는 이유는 무엇입니까?

+1

에 비해

new TreeSet<Integer>((a, b) -> uncheckCall(() -> exceptionThrowingMethod(a, b))) 

. 도입 된 것은 람다 식에서 그러한 변수에 액세스 할 수있는 능력이었습니다. 'Effectively final'은 실제로 변경되지 않는 변수와 Java가 생성 된 이후에 존재했던 변수를 설명하는 방법 일뿐입니다. – RealSkeptic

+0

http://stackoverflow.com/questions/20938095/difference-between-final-and-effectively-final – Akshay

+0

더 적은 코드는 "게으름"이 아니라 "표현력"이라고합니다. 고맙게도 Java는 그 미덕을 인식하기 시작했습니다. –

답변

4

자바 (버전 1.1 이후)의 클로저는 final 개의 변수에서만 닫을 수 있습니다. 무의미하게 익명의 클래스 구문을 사용하면 소수의 추가 final 수식어는별로 중요하지 않지만 (매개 변수 목록에서 사용자가 뛰어 오른 경우 때때로 깜짝 놀랐지 만) 새 간결한 람다 구문을 사용하면됩니다. 그들은 또한 람다가 코드 구조에 덜 매끄럽게 섞이도 록 할 것입니다. 특히 중첩 된 람다의 경우를 고려 : 그것은이 도입되지 않은

new TreeSet<Integer>((final Integer a, final Integer b) -> 
    uncheckCall(() -> exceptionThrowingMethod(a, b)) 
관련 문제