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

2022-08-31 20:30:42

为什么IDE抱怨“在构造函数中泄漏了这个”?我一直认为这只是不好的做法。但实际上,我从未发现为什么它不好。


答案 1

泄漏构造函数(不是控制器)中的引用是危险的,尤其是在多线程环境中。这是因为在构造函数调用完成之前,对象尚未完全构造。因此,从构造函数泄漏意味着外部世界可以访问尚未完全构造的对象。这可能不一定会导致单线程程序中出现问题(尽管这是可能的,但在这种情况下,问题要明显得多)。但是,如果泄漏到其他线程,他们实际上可以尝试在对象构造完成之前对对象执行某些操作,从而导致微妙且难以找到的错误。thisthisthis


答案 2

生活中很少有绝对的东西,例如。你必须缴税...或。。。死亡是不可避免的。但是“从构造函数中传出总是不好的”不是其中之一。this

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

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

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