首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在构造函数警告中泄漏此信息

在构造函数警告中泄漏此信息
EN

Stack Overflow用户
提问于 2010-10-13 15:36:18
回答 7查看 56.2K关注 0票数 87

我想要避免Netbeans 6.9.1的(大多数)警告,而且我对'Leaking this in constructor'警告有一个问题。

我理解这个问题,在构造函数中调用一个方法并传递"this“是危险的,因为"this”可能还没有完全初始化。

修复我的单例类中的警告很容易,因为构造函数是私有的,并且只能从同一个类中调用。

旧代码(简化):

代码语言:javascript
复制
private Singleton() {
  ...
  addWindowFocusListener(this);
}

public static Singleton getInstance() {

  ...
  instance = new Singleton();
  ...
}

新代码(简化):

代码语言:javascript
复制
private Singleton() {
  ...
}

public static Singleton getInstance() {

  ...
  instance = new Singleton();
  addWindowFocusListener( instance );
  ...
}

如果构造函数是公共的,并且可以从其他类调用,则此修复不起作用。如何修复以下代码:

代码语言:javascript
复制
public class MyClass {

  ...
  List<MyClass> instances = new ArrayList<MyClass>();
  ...

  public MyClass() {
    ...
    instances.add(this);
  }

}

当然,我想要一个修复,它不需要使用这个类修改我所有的代码(例如,通过调用init方法)。

EN

回答 7

Stack Overflow用户

发布于 2010-10-13 15:46:03

这是一个很好的例子,创建了你的类的实例的工厂会很有帮助。如果工厂负责创建类的实例,那么您将有一个调用构造函数的集中位置,并且将所需的init()方法添加到代码中将是微不足道的。

关于您的直接解决方案,我建议您将任何泄漏this的调用移到构造函数的最后一行,然后在“证明”这样做是安全的后,使用注释来抑制它们。

在IntelliJ IDEA中,您可以通过该行上方的以下注释取消显示此警告:

//noinspection ThisEscapedInObjectConstruction

票数 12
EN

Stack Overflow用户

发布于 2013-01-09 22:47:15

你可以这样写:

代码语言:javascript
复制
addWindowFocusListener(Singleton.this);

这将阻止NB显示警告。

票数 4
EN

Stack Overflow用户

发布于 2011-02-08 05:57:18

注释@SuppressWarning(“LeakingThisInConstructor”)只适用于类,而不适用于构造函数本身。

解决方案我建议:创建私有方法init(){/* use this here*/}并从构造函数调用它。NetBeans不会警告你。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3921616

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档