如何在内部类中更改局部变量的值?

时间:2014-11-21 12:27:28

标签: java android inner-classes

我刚学会了我不能在匿名内部类中使用非最终局部变量,所以当我们需要在不声明即时变量的情况下更改内部类中的值时,是否有任何棘手的方法?

3 个答案:

答案 0 :(得分:4)

您无法正常使用它们,在继续操作之前需要考虑这些因素。您将如何处理匿名类的实例?如果它只在本地使用,在该方法的范围内,那么你可以使用这个简单的技巧(假设你有一个int var):

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

如果实例在创建它的方法返回后可以访问,那么您可能会遇到线程安全问题。实例可以传递给其他线程,上面的简单设计不是线程安全的。

答案 1 :(得分:2)

您可以编写自己非常简单的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();

答案 2 :(得分:0)

您可以使用此代码段。

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