2012-05-20 4 views
6

메서드 로컬 내부 클래스는 메서드가 끝난 후에도 여전히 메서드 로컬 내부 클래스의 인스턴스가 활성화되어 있기 때문에 로컬 변수에 액세스 할 수 없습니다. 그러나 지역 변수가 사라지면 지역 변수는 사라집니다. 메서드 로컬 내부 클래스가 최종 로컬 변수에 액세스 할 수 있다는 것을 알았습니다.이 메서드가 끝난 후에도 최종 로컬 변수가 아직 살아 있는지 여부를 알 수 있습니까?Java의 최종 로컬 변수의 범위

+3

아무도 우연히 질문을 오해하지 않도록 예제를 게시하는 데주의하십시오. 우리는 코더이며, 자바 코드는 훨씬 더 명확하게 알려줄 것입니다. – jmort253

+0

이것이 의미하는 바이며 작동하지 않는다고 생각합니다. http://ideone.com/LNg9w –

+0

@HunterMcMillen 질문은 메소드 - 로컬 클래스에 관한 것이지 다른 메소드에는 관한 것이 아닙니다. – Jeffrey

답변

7

일종의. Java 익명 내부 클래스는 "클로저"처럼 동작합니다. 즉, 현재 로컬 상태를 "닫습니다". 그러나 Java는 이러한 클래스를 최종 변수 주변에서만 닫을 수 있습니다. 그렇지 않은 경우 변수의 로컬 상태가 변경 될 수 있지만 내부 클래스에 유지되는 버전은 변경되지 않으므로 "만료 된"인스턴스에 액세스하게됩니다. 이것은 프로그래머에게 혼란 스러울 수 있습니다.

대신 Java에서는 변수 재 지정이 아닌 메소드를 통해 인스턴스가 변경 가능성을 처리해야합니다. 이로 인해 명확성이 향상되고보다 간단한 디버깅이 가능합니다. Java가 수행하는 이유에 대한 자세한 내용은 this answer을 참조하십시오.

클래스에 여전히 변수에 대한 참조가 있으므로 질문에 대한 대답은 입니다. 내부 클래스가 변수의 소유권을 양도 할 때까지 해당 인스턴스가 가비지 수집되지 않습니다.

+1

* "이것은 프로그래머에게 혼란 스러울 수 있습니다."* - 더 이상 요점은 더 이상 폐쇄와 같지 않을 것입니다. 어휘 문맥에 따라 다른 바인딩을 가진 식별자 이름을 가질 수 있습니다. –

+0

@Stephen 충분히 공정하고 좋은 지적입니다. –

1

아니요. 즉, 사본이 내부 클래스 인스턴스에서 아직 살아 있음을 의미합니다. '최종'은 두 개의 사본이 혼란스럽게 가치에서 벗어나지 않도록합니다.