据我了解,内部匿名类中使用的任何变量(但在其外部声明)实际上都是传递其值的副本。还要求将这些外部变量声明为final,这显然意味着这些变量不应被修改。
但对此有什么解决方法吗?我的匿名内部类可以实际修改一些变量或对象,然后我可以在我的代码中使用它(在匿名类之外)吗?或者不会在匿名类之外看到修改?
答案 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来保存值。