代码之家  ›  专栏  ›  技术社区  ›  Arlaharen

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

  •  2
  • Arlaharen  · 技术社区  · 14 年前

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

    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() 叫什么名字?

    4 回复  |  直到 14 年前
        1
  •  4
  •   Thilo    14 年前

    Foo不会被垃圾收集,因为在引擎盖下,bar会包含对它的引用。

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

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

        2
  •  0
  •   locka    14 年前

    它可以是安全的,但这取决于内部类在做什么。

    变量也需要是final。这是一种语言限制,用于防止内部类在运行时更改变量的引用。这有点痛苦,如果它是语言的一个隐含而不是显式的特征,那就太好了。

        3
  •  0
  •   Joeri Hendrickx    14 年前

    如果你做的是正常的事情(不是通过反射或其他方式来攻击类加载器),那么它是非常安全的。正如其他人提到的,有一个从内部到外部对象的隐式引用(只要内部类不是静态定义的),所以它不会被垃圾收集。

    根据经验,有 根本不可能

        4
  •  0
  •   user207421    14 年前

    你的代码无法编译,所以你的问题毫无意义。当你放入所需的“final”修饰符时,代码会编译并且是安全的,这就是“final”修饰符所表达的意思。