修改匿名内部类中的外部变量

时间:2014-12-26 20:28:54

标签: java anonymous-function anonymous-class

据我了解,内部匿名类中使用的任何变量(但在其外部声明)实际上都是传递其值的副本。还要求将这些外部变量声明为final,这显然意味着这些变量不应被修改。

但对此有什么解决方法吗?我的匿名内部类可以实际修改一些变量或对象,然后我可以在我的代码中使用它(在匿名类之外)吗?或者不会在匿名类之外看到修改?

2 个答案:

答案 0 :(得分:4)

您所引用的行为仅适用于局部变量或方法/捕获参数。您可以访问并且可能正确地修改实例成员

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";
}

匿名Object内部类复制localFoo的值,以便在println(..)调用中使用。但是,对于foo,它实际上是"复制"对Example实例的引用并引用其foo字段。

它实际上相当于

Example.this.foo = "bar";

答案 1 :(得分: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;";
        }

    }
}

这大大简化了 - 你通常会使用getter和setter来保存值。