주석에서 언급했듯이, 일부는 Java 8에서는 관련이 final
없으며 암시적일 수 있습니다. 익명의 내부 클래스 또는 람다 식 에는 효과적으로 최종 변수 만 사용할 수 있습니다.
기본적으로 Java가 클로저를 관리하는 방식 때문 입니다.
익명 내부 클래스의 인스턴스를 만들면 해당 클래스 내에서 사용되는 모든 변수 는 자동 생성 생성자를 통해 값이 복사됩니다. 이렇게하면 컴파일러가 "로컬 변수"의 논리적 상태를 유지하기 위해 다양한 추가 유형을 자동 생성하지 않아도됩니다. 예를 들어 C # 컴파일러는 다음과 같습니다. (C #은 익명 함수에서 변수를 캡처 할 때 실제로 변수를 캡처합니다. 클로저는 메소드의 본문에서 볼 수있는 방식으로 변수를 업데이트 할 수 있습니다.
값이 익명 내부 클래스의 인스턴스에 복사되었으므로 변수가 나머지 메소드로 수정 될 수 있으면 이상하게 보일 것입니다. 오래된 변수로 작동하는 것으로 보이는 코드가있을 수 있습니다 ( 그 효과적으로 무엇 때문에 할 일이있을 ... 당신이 다른 시간에 촬영 한 사본)와 함께 일하게 될 것입니다. 마찬가지로 익명의 내부 클래스 내에서 변경을 수행 할 수있는 경우 개발자는 해당 변경 사항이 엔 클로징 메서드 본문 내에서 표시 될 것으로 기대할 수 있습니다.
변수를 final로 설정하면 이러한 모든 가능성이 제거됩니다. 값을 전혀 변경할 수 없기 때문에 이러한 변경이 표시 될지 걱정할 필요가 없습니다. 메소드와 익명의 내부 클래스가 서로의 변경 사항을 볼 수있게하는 유일한 방법은 변경 가능한 유형의 설명을 사용하는 것입니다. 이것은 둘러싸는 클래스 자체, 배열, 변경 가능한 래퍼 유형 등이 될 수 있습니다. 기본적으로 그것은 한 메소드와 다른 메소드 사이의 통신과 비슷합니다. 한 메소드의 매개 변수 에 대한 변경 사항은 호출자 가 볼 수 없지만 매개 변수가 참조 하는 객체의 변경 사항 은 볼 수 있습니다.
Java와 C # 클로저의보다 자세한 비교에 관심이 있다면 더 자세히 다루는 기사 가 있습니다. 이 답변에서 Java 측에 집중하고 싶었습니다. :)