2014-11-21 23 views
3

익명의 내부 클래스 내에서 final이 아닌 로컬 변수를 사용할 수 없다는 것을 알았으므로 인스턴스 변수를 선언하지 않고 내부 클래스 내부의 값을 변경해야 할 때 까다로운 방법이 있습니까?내부 클래스 내부에서 로컬 변수의 값을 변경하는 방법은 무엇입니까?

+0

수퍼를 호출 할 수 있습니다. – DrRoach

+1

내부 클래스 내부에서는 비 최종 로컬 변수를 사용할 수 있지만 외부 클래스에서 발생한 로컬 변수는 사용할 수 없습니다. – Smutje

+0

로컬 변수가 아닌 최종 변수 인 경우 메서드의 끝에서 소멸되므로 내부 클래스 내부에서 어떻게 액세스 할 수 있습니까? 마지막으로 만들거나 인스턴스 변수를 사용하여 범위를 늘리십시오. – Braj

답변

4

진행하기 전에 고려해야 할 충분한 이유 때문에 사용할 수 없습니다. 익명의 클래스의 인스턴스로 정확히 무엇을 할 것입니까? 이 메소드의 범위 내에서, 로컬에만 소비되는 경우,이 간단한 트릭을 사용할 수 있습니다 (의 당신은 int VAR가 있다고 가정하자) :

final int localVar[] = {1}; 
new AnonymousClass() { 
    public void method() { localVar[0]++; } 
}; 

를 인스턴스가 반환 만든 방법 후 도달 할 경우, 스레드 안전 문제가 발생할 수 있습니다. 인스턴스가 다른 스레드로 전달 될 수 있으며 위의 단순한 디자인은 스레드로부터 안전하지 않습니다.

+0

내 코드에서 익명의 내부 클래스는 메서드가 끝난 후에도 접근 할 수 있지만 여전히 까다로운 thnx입니다. – Morteza

0

이 스 니펫을 사용할 수 있습니다.

void someMethod(){ 
    final AtomicReference<String> var = new AtomicReference<String>("Blah") 
    foo(new Bar(){ 
     void baz(){ 
      var.set("Blah-blah"); 
     } 
    }); 
} 
+0

예. 나는 나의 모범을 편집했다. – talex

1

매우 간단하게 쓸 수 있습니다. Holder.

/** 
* Make a final one of these to hold non-final things in. 
*/ 
public class Holder <T> { 
    private T held = null; 

    public Holder() { 
    } 

    public Holder (T it) { 
    held = it; 
    } 

    public void hold(T it) { 
    held = it; 
    } 

    public T held() { 
    return held; 
    } 

    @Override 
    public String toString() { 
    return String.valueOf(held); 
    } 
} 

원자력을 사용하지 마십시오. 상당한 오버 헤드가 있습니다.

final Holder<Integer> number = new Holder(0); 
... { 
    number.hold(n); 
} 
... 
return number.held(); 
관련 문제