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

泄漏到构造函数警告中

泄漏到构造函数警告中

慕斯王 2019-10-29 15:02:54
我想避免NetBeans 6.9.1的(大部分)警告,并且该'Leaking this in constructor'警告有问题。我理解问题所在,在构造函数中调用方法并传递“ this”很危险,因为“ this”可能尚未完全初始化。在我的单例类中修复警告很容易,因为构造函数是私有的,只能从同一类调用。旧代码(简体):private Singleton() {  ...  addWindowFocusListener(this);}public static Singleton getInstance() {  ...  instance = new Singleton();  ...}新代码(简体):private Singleton() {  ...}public static Singleton getInstance() {  ...  instance = new Singleton();  addWindowFocusListener( instance );  ...}如果构造函数是公共的,并且可以从其他类调用,则此修补程序将无法正常工作。如何修复以下代码:public class MyClass {  ...  List<MyClass> instances = new ArrayList<MyClass>();  ...  public MyClass() {    ...    instances.add(this);  }}当然,我需要一个不需要使用此类修改所有代码的修补程序(例如,通过调用init方法)。
查看完整描述

3 回答

?
冉冉说

TA贡献1877条经验 获得超1个赞

因为您确保将您instances.add(this)放在构造函数的末尾,所以恕我直言,应该安全地告诉编译器仅禁止显示警告 (*)。警告从本质上说,不一定意味着有什么问题,只需要引起您的注意。


如果您知道自己在做什么,则可以使用@SuppressWarnings注释。就像Terrel在他的评论中提到的那样,从NetBeans 6.9.1开始,以下注释可以做到这一点:


@SuppressWarnings("LeakingThisInConstructor")

(*)更新:正如Isthar和Sergey指出的那样,在某些情况下,“泄漏”构造函数代码看起来非常安全(如您所提的问题),但事实并非如此。还有更多的读者可以批准吗?由于上述原因,我正在考虑删除此答案。


查看完整回答
反对 回复 2019-10-29
?
人到中年有点甜

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

这是创建工厂实例实例的工厂会有所帮助的一个好例子。如果Factory负责创建类的实例,则将在一个集中位置调用构造函数,并且将必需的init()方法添加到代码中将变得很简单。


关于您的立即解决方案,我建议您将泄漏的所有调用移到this构造函数的最后一行,然后在“证明”这样做是安全的之后,使用注释将它们隐藏。


在IntelliJ IDEA中,可以在行上方的以下注释中取消此警告:

//noinspection ThisEscapedInObjectConstruction


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

添加回答

举报

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