2014-12-26 5 views
0

내가 알고 있듯이 내부 익명 클래스 내에서 (그러나 선언되지 않은) 모든 변수는 실제로 값의 복사본이 전달됩니다. 또한 이러한 외부 변수를 최종 변수로 선언해야한다는 요구 사항이 있습니다.이 변수는 이러한 변수가 수정되지 않는 것을 의미합니다.익명의 내부 클래스 내에서 외부 변수 수정하기

그러나 이것에 대한 해결 방법이 있습니까? 내 익명의 내부 클래스가 실제로 변수 나 객체를 수정할 수 있습니까? 나중에 익명 클래스 외부의 코드에서 사용할 수 있습니까? 또는 수정 사항이 익명의 클래스 외부에서 보이지 않습니까?

+1

실제로 해당합니다. –

답변

2

참조하는 동작은 로컬 변수 또는 메서드/캐치 매개 변수에만 적용됩니다. 액세스하고, 잠재적으로

public class Example { 

    public void method() { 
     String localFoo = "local"; 
     new Object() { 
      public void bar() { 
       foo = "bar"; // yup 
       System.out.println(localFoo); // sure 
       localFoo = "bar"; // nope 
      } 
     };   
    } 

    private String foo = "foo"; 
} 

println(..) 호출 내에서 사용할 localFoo의 익명 Object 내부 클래스 복사 값

잘 인스턴스 멤버를 수정할 수 있습니다. 그러나 foo의 경우 실제로 참조를 Example 인스턴스에 "복사"하고 해당 foo 필드를 참조합니다.

그것은 아니요, 지역 변수 (또는 매개 변수)이 제한이

Example.this.foo = "bar"; 
+0

응답 해 주셔서 감사합니다. 이 Example 객체를 인스턴스화하고 그 객체에 대해 method()를 호출 한 다음 'foo'필드를 인쇄하면 'bar'가 아니라 'foo'로 남아있는 것처럼 보입니다. 왜 이런거야? – Decoy

+0

@Decoy 당신은'bar()'를 호출하지 않았다. –

+0

어리석은 실수! 고맙습니다. – Decoy

1

참조 된 개체는 실제로 최종해야하지만 실제로 변경할 수 있습니다.

class Holder<T> { 
    public T held; 
} 

public void test() { 
    final Holder<String> s = new Holder<>(); 
    new Runnable() { 

     @Override 
     public void run() { 
      s.held = "Hello;"; 
     } 

    } 
} 

이것은 크게 단순화되어 있습니다. 일반적으로 보유 값에 게터와 설정자를 사용합니다.

+0

우수한 솔루션! 고맙습니다! –