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

Rei*_*ard 32 java this

为什么IDE会抱怨"在构造函数中泄漏这个"?我一直认为这只是不好的做法.但我实际上从来没有发现为什么它是坏的.

Pét*_*rök 60

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

  • 有人可以为这篇文章制作并附上"最佳做法"标签吗? (2认同)
  • 在单线程程序中泄漏`this`的问题是什么? (2认同)

sco*_*ttb 11

生命中几乎没有绝对,例如.你必须纳税......或者......死亡是不可避免的.但是"传递this出一个构造函数总是坏的"是 - 不是其中之一.

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

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

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

  • 只是不要这样做.我们浪费了几天时间来解决几年前创建的一个错误,当时有人将"this"从构造函数传递给"可信"的"包私有"方法.随着时间的推移,该方法最终增长,并且未初始化的实例进入事件队列.只需在构建后使用最终的init(),并成为一个匿名的英雄. (8认同)