我让“这个”参考逃脱了吗? (构造函数实例化中的内部类,没有事件侦听器,没有线程)

时间:2013-06-11 13:41:11

标签: java

我在构造函数中实例化一个内部类,但我没有用它来启动线程或作为事件监听器。例如:

public class Something {

    final InnerSomething innerSomething = new InnerSomething();

    public Something(Param arg) {
        super(arg);
    }

    private class InnerSomething {...}

    ...
}
编辑:我复制了&从其他地方粘贴代码并忘记删除“abstract”关键字。

EDIT2:“'this'参考转义”的“我的”定义是“Java Concurrency in Practice”一书中的一个。

使用上面的代码,我允许'this'引用“escape”吗?

2 个答案:

答案 0 :(得分:6)

从技术上讲,您是InnerSomethingthis的构造函数返回之前将引用Something 的。

但是,如果你没有在InnerSomething的构造函数中发布引用并且不对它执行任何操作,则不应该产生问题。请注意,最好将innerSomething私有标记为可以通过package-private字段访问this

如果您参考JCiP#3.2.1,他们会说:

  

更具体地说,this引用不应该在构造函数返回之后从线程中转义。 this引用可以由构造函数存储在某处,只要在构造之后它不被另一个线程使用。

答案 1 :(得分:1)

我不相信。 “逃脱”意味着公共访问可变的私人参考。我在你发布的代码中没有看到。

我们是否同意该术语的含义?