gpt4 book ai didi

java - 在构造函数警告中泄漏这个

转载 作者:IT老高 更新时间:2023-10-28 11:47:00 26 4
gpt4 key购买 nike

我想避免 Netbeans 6.9.1 的(大部分)警告,我遇到了 'Leaking this in constructor' 警告的问题。

我明白问题所在,在构造函数中调用方法并传递“this”是危险的,因为“this”可能尚未完全初始化。

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

旧代码(简化):

private Singleton() {
...
addWindowFocusListener(this);
}

public static Singleton getInstance() {

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

新代码(简化):

private Singleton() {
...
}

public static Singleton getInstance() {

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

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

public class MyClass {

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

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

}

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

最佳答案

由于您确保将 instances.add(this) 放在构造函数的末尾,您 应该恕我直言,告诉编译器简单地抑制警告 (*)。就其性质而言,警告并不一定意味着有问题,它只是需要您注意。

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

@SuppressWarnings("LeakingThisInConstructor")

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

关于java - 在构造函数警告中泄漏这个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3921616/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com