[英]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.