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

标签 java

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

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/

相关文章:

java - 使用Java方法显示HTML代码

java - GUI、java、SWT 和世界地图表示

java - Dr java keylistener 帮助对象在按键释放后移动

java - 零长度匹配是否结束匹配过程?

java - Spring MVC : Expire privilege flag after 5 minutes for edit

java - 国际电话的正则表达式

java - 什么是初始化 block ?

java - 在 Java 8 中添加对类的所有方法的跟踪

java - Play框架验证: Redisplay input

java - Make 没有像我期望的那样解决过时的依赖关系