我想要避免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方法)。
发布于 2010-10-13 15:46:03
这是一个很好的例子,创建了你的类的实例的工厂会很有帮助。如果工厂负责创建类的实例,那么您将有一个调用构造函数的集中位置,并且将所需的init()方法添加到代码中将是微不足道的。
关于您的直接解决方案,我建议您将任何泄漏this的调用移到构造函数的最后一行,然后在“证明”这样做是安全的后,使用注释来抑制它们。
在IntelliJ IDEA中,您可以通过该行上方的以下注释取消显示此警告:
//noinspection ThisEscapedInObjectConstruction
发布于 2013-01-09 22:47:15
你可以这样写:
addWindowFocusListener(Singleton.this);这将阻止NB显示警告。
发布于 2011-02-08 05:57:18
注释@SuppressWarning(“LeakingThisInConstructor”)只适用于类,而不适用于构造函数本身。
解决方案我建议:创建私有方法init(){/* use this here*/}并从构造函数调用它。NetBeans不会警告你。
https://stackoverflow.com/questions/3921616
复制相似问题