请参阅此不完整的代码片段:
public class Singleton implements Serializable {
private static class SingletonHolder {
private static final Singleton SINGLETON_INSTANCE;
static {
Singleton tmp = singletonTMP;
if (tmp != null) {
SINGLETON_INSTANCE = tmp;
} else {
// etc.
}
}
}
private static volatile Singleton singletonTMP;
// etc.
}
我在NetBeans第Singleton tmp = singletonTMP;
行收到一个奇怪的警告:“在初始化期间使用静态非最终变量”。
所以,是的。当然,这是事实,但为什么这会成为一个问题呢?
答案 0 :(得分:0)
问题在于变量:
private static final Singleton SINGLETON_INSTANCE;
可能没有在你的静态块中初始化,你可以在静态块内的else子句中将它初始化为null(即):
static
{
Singleton tmp = singletonTMP;
if (tmp != null)
{
SINGLETON_INSTANCE = tmp;
} else
{
**SINGLETON_INSTANCE = null;**
}
}
答案 1 :(得分:0)
在阅读了一些关于安全性之后,我认为我以前的评论是正确的。
我认为这是一个安全问题,攻击者可以使用新对象替换您的静态字段。当属性也被定义为public时会发生这种情况。我假设netbeans认为它是一种风险并且即使您将其声明为私有也会显示警告。