定义局部内部类时,访问仅该类引用的包含方法的局部变量是否安全。就像这样:
public Bar containingMethod()
{
Foo foo = new Foo();
Bar bar = new Bar()
{
public void baz()
{
System.out.println("Accessing foo: " + foo.getValue());
}
};
return bar;
};
在上面的示例中,我不确定所定义的类是否引用了 foo
。问题是这样做是否安全且可以,或者我是否面临在调用 bar.baz()
之前 foo
被垃圾收集的风险?
最佳答案
它是安全的,但 foo 需要是最终的(否则你应该得到一个编译错误)。
Foo 不会被垃圾回收,因为在幕后,bar 将包含对它的引用。
foo 需要最终的原因是为了避免这个隐藏的引用不同步。
从垃圾收集的角度来看,即使 foo 不是最终的,它也是安全的。但是 bar 所持有的 foo 引用是在创建 bar 时分配的,并且从未更新,因此如果允许包含方法稍后向 foo 分配其他内容,bar 仍然会看到“旧”对象。
请注意,final 的要求仅适用于局部变量和参数,不适用于包含类的实例字段。
关于java - 局部内部类安全访问包含方法的局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3545497/