2009-12-22 3 views
18

Java 최종 로컬 변수는 어디에 저장됩니까?

다음 예를보십시오.

public void init() { 
    final Environment env = new Environment(); 
    Runtime.getRuntime().addShutdownHook(new Thread() { 
     public void run() { 
      env.close(); 
     } 
    }); 
} 

첫째, env은 어디에 저장됩니까? 그것은 :

      • 스택에 남아 있고 어떻게 든 참조 된
      • 뭔가 다른

      추측 첫 번째 옵션입니다.

      두 번째로 최종 로컬을 참조하는 많은 내부 클래스 구조를 만드는 경우 (특히 클래스의 멤버 변수로 env을 만들고이를 참조하는 것보다는)이 작업으로 인해 발생하는 성능 문제를 해결하십시오 변수.

답변

18

예, 변수가 복사 된 이유는 변수를 final로 선언해야하는 이유입니다. 이렇게하면 복사가 완료된 후에도 변경되지 않을 것입니다.

이것은 최종 필드가 아니더라도 액세스 할 수있는 인스턴스 필드의 경우와 다릅니다. 이 경우 내부 클래스는이 용도로 사용하는 외부 인스턴스에 대한 참조를 가져옵니다.

private Environment env; // a field does not have to be final 

public void init() { 
    Runtime.getRuntime().addShutdownHook(new Thread() { 
     public void run() { 
      env.close(); 
     } 
    }); 
} 

둘째,이 일에서 발생하는 모든 성능 문제를합니까?

무엇에 비해? 내부 클래스가 작동하려면 필드 또는 변수가 있어야하며 사본은 매우 효율적인 방법입니다. 어쨌든 "얕은"복사본 일뿐입니다. 예를 들어 환경에 대한 참조 만 복사되고 환경 자체는 복사되지 않습니다.

+0

이렇게하면 발생하는 성능 문제가 없다고 가정 할 수 있습니까? – Joel

+0

내 개인적인 애완 동물은이 영역에서 피할 수없는 경우 외부 인스턴스에 대한 참조 (변수에 복사되지 않은 필드에 액세스하는 데 사용됨)가 문제가 될 수 있다는 점이 다릅니다. http://stackoverflow.com/questions/ 758570/is-it-possible-to-make-make-anonymous-inner-classes-in-java-static – Thilo

+0

을 멤버 변수로 참조하는 것과 비교합니다. 복사 된 경우에는 성능에 영향이 없다고 가정합니다. – Joel

관련 문제