gpt4 book ai didi

java - 局部内部类安全访问包含方法的局部变量

转载 作者:行者123 更新时间:2023-11-30 07:36:29 25 4
gpt4 key购买 nike

定义局部内部类时,访问只有该类引用的包含方法的局部变量是否安全。像这样:

public Bar containingMethod()
{
Foo foo = new Foo();
Bar bar = new Bar()
{
public void baz()
{
System.out.println("Accessing foo: " + foo.getValue());
}
};
return bar;
};

在我上面的例子中,我不确定被定义的类是否有对 foo 的引用。问题是这样做是否安全且可以,或者我是否冒着 foo 在调用 bar.baz() 之前被垃圾收集的风险?

最佳答案

它是安全的,但 foo 必须是最终的(否则你会得到一个编译错误)。

Foo 不会被垃圾回收,因为在底层,bar 将包含对它的引用。

foo 需要是 final 的原因是为了避免这个隐藏的引用不同步。

从垃圾回收的角度来看,即使 foo 不是 final 也是安全的。但是 bar 持有的 foo 引用是在创建 bar 时分配的,并且从未更新过,因此如果稍后允许包含方法将其他内容分配给 foo,bar 仍然会看到“旧”对象。

请注意,final 要求仅适用于局部变量和参数,不适用于包含类的实例字段。

关于java - 局部内部类安全访问包含方法的局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3545497/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com