Java在构造函数中泄漏了这个

时间:2012-03-24 12:35:09

标签: java this

为什么IDE会抱怨“在构造函数中泄露这个”?我一直认为这只是不好的做法。但实际上我从来没有发现它为什么会这么糟糕。

2 个答案:

答案 0 :(得分:58)

泄漏构造函数(非控制器)中的this引用是危险的,尤其是在多线程环境中。这是因为在构造函数调用完成之前,对象尚未完全构造。因此,从构造函数中泄漏this意味着外部世界可以访问尚未完全构造的对象。这可能不一定会导致单线程程序出现问题(尽管有可能,但在这种情况下问题更加明显)。但是如果this被泄露给其他线程,它们实际上可以在构造完成之前尝试对该对象做一些事情,这会导致细微且难以发现的错误。

答案 1 :(得分:10)

生命中几乎没有绝对,例如。你必须纳税......或者......死亡是不可避免的。但是“将this从构造函数中传递出来总是很糟糕”是 - 不是其中之一。

彼得指出的警告非常恰当和有效。将this从构造函数泄漏到将引用发布到未知或不可信客户端的任何方法或上下文中肯定会有问题。将尚未完全构造的对象的引用发布到任何客户端代码(无论是否受信任)仍然是错误的,它假设它将具有对有效且一致的对象的视图。

也就是说,将this从构造函数传递给package-private方法绝对没有错,该方法在共享公共接口的一组对象上执行公共初始化,特别是在初始化时是冗长或复杂的。

TL; DR:在某些情况下,在我看来,不仅可以接受从构造函数传递this,而且实际上是可取的。