我想避免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指出的那样,在某些情况下,“泄漏”构造函数代码看起来非常安全(如您所提的问题),但事实并非如此。还有更多的读者可以批准吗?由于上述原因,我正在考虑删除此答案。
人到中年有点甜
TA贡献1895条经验 获得超7个赞
这是创建工厂实例实例的工厂会有所帮助的一个好例子。如果Factory负责创建类的实例,则将在一个集中位置调用构造函数,并且将必需的init()方法添加到代码中将变得很简单。
关于您的立即解决方案,我建议您将泄漏的所有调用移到this构造函数的最后一行,然后在“证明”这样做是安全的之后,使用注释将它们隐藏。
在IntelliJ IDEA中,可以在行上方的以下注释中取消此警告:
//noinspection ThisEscapedInObjectConstruction
添加回答
举报
0/150
提交
取消