Java泄漏这在构造函数

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

构造函数 (不是控制器)中泄漏this引用是很危险的,特别是在multithreading环境中。 这是因为在构造函数调用完成之前对象没有完全构造。 因此,从构造函数泄漏this意味着外部世界可以访问尚未完全构build的对象。 这可能不一定会导致单线程程序中的问题(虽然这是可能的,但在这种情况下问题更加明显)。 但是如果this漏洞泄露给其他线程,那么在构build完成之前,他们实际上可能会试图对这个对象做些什么,这就导致了微妙而难以发现的错误。

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

彼得指出的告诫都是恰当而有效的。 将this从构造函数泄漏到任何方法或上下文中将引用发布给未知或不可信的客户端当然是有问题的。 将尚未完全构造的对象的引用发布到任何可信或不可信的客户端代码上仍是不好的,因为它假定它将有一个有效且一致的对象。

也就是说,把this从一个构造函数传递给一个包私有方法是完全没有错的, this方法对共享一个公共接口的一组对象执行一个公共的初始化,特别是如果初始化过程冗长或复杂的话。

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