繁体   English   中英

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

[英]Modifying an outer variable within an anonymous inner class

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

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

您所指的行为仅适用于局部变量或方法/捕获参数。 您可以正常访问和修改实例成员

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

引用的对象确实确实必须是最终的-但是,它们可以是可变的。

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作为保留值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM