泄漏到构造函数警告中

我想避免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方法)。


慕斯王
浏览 492回答 3
3回答

冉冉说

因为您确保将您instances.add(this)放在构造函数的末尾,所以恕我直言,应该安全地告诉编译器仅禁止显示警告 (*)。警告从本质上说,不一定意味着有什么问题,只需要引起您的注意。如果您知道自己在做什么,则可以使用@SuppressWarnings注释。就像Terrel在他的评论中提到的那样,从NetBeans 6.9.1开始,以下注释可以做到这一点:@SuppressWarnings("LeakingThisInConstructor")(*)更新:正如Isthar和Sergey指出的那样,在某些情况下,“泄漏”构造函数代码看起来非常安全(如您所提的问题),但事实并非如此。还有更多的读者可以批准吗?由于上述原因,我正在考虑删除此答案。

人到中年有点甜

这是创建工厂实例实例的工厂会有所帮助的一个好例子。如果Factory负责创建类的实例,则将在一个集中位置调用构造函数,并且将必需的init()方法添加到代码中将变得很简单。关于您的立即解决方案,我建议您将泄漏的所有调用移到this构造函数的最后一行,然后在“证明”这样做是安全的之后,使用注释将它们隐藏。在IntelliJ IDEA中,可以在行上方的以下注释中取消此警告://noinspection ThisEscapedInObjectConstruction
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java