为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

郎朗坤 2019-10-31 12:54:01
为什么IDE会抱怨“在构造函数中泄漏”?我一直认为这只是一种不好的做法。但是我实际上从来没有发现为什么它不好。
查看完整描述

3 回答

?
阿晨1998

TA贡献2037条经验 获得超6个赞

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


查看完整回答
反对 回复 2019-10-31
?
喵喵时光机

TA贡献1846条经验 获得超7个赞

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

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

就是说,this从构造方法传递到程序包私有的方法绝对没有错,该方法对一组共享公共接口的对象执行公共初始化,特别是在初始化时间长或复杂的情况下。

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


查看完整回答
反对 回复 2019-10-31
?
绝地无双

TA贡献1946条经验 获得超4个赞

只是不要这样做。我们只是浪费了很多时间来解决几年前创建的错误,当时有人将构造函数中的“ this”传递给“可信任的”“ package private”方法。随着时间的流逝,该方法逐渐发展壮大,并且未初始化的实例进入了事件队列。构造后只需使用最终的init(),即可成为匿名英雄

查看完整回答
反对 回复 2019-10-31
  • 3 回答
  • 0 关注
  • 445 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信