初始化期间使用的静态非最终变量

时间:2014-11-20 09:38:56

标签: java netbeans static final

请参阅此不完整的代码片段:

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;行收到一个奇怪的警告:“在初始化期间使用静态非最终变量”。

所以,是的。当然,这是事实,但为什么这会成为一个问题呢?

2 个答案:

答案 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认为它是一种风险并且即使您将其声明为私有也会显示警告。

此处有更多详情: https://www.securecoding.cert.org/confluence/display/java/OBJ10-J.+Do+not+use+public+static+nonfinal+variables