Singleton利用時の注意

以下のコードだとエラーになっちゃった。

public Class Hoge {
    private static Hoge instance_ = new Hoge();
    private static final Log log = LogFactory.getLog(Hoge.class);

    private Hoge() {
        if(log.isInfoEnabled()){
            log.info("インスタンス生成");
        }
    }

    public static Hoge getInstance() {
        return instance_;
    }
}

理由は、getInstance() が呼ばれる段階では
まだクラス変数の初期化が行われていないから。
instance_ が null でした。


Singletonの書き方が根本的にまずかったのね。
以下のようにすればOKでした。

public Class Hoge {
    private static Hoge instance_;
    private static final Log log = LogFactory.getLog(Hoge.class);

    private Hoge() {
        if(log.isInfoEnabled()){
            log.info("インスタンス生成");
        }
    }

    public static synchronized Hoge getInstance() {
        if(instance_ == null) instance_ = new Hoge();
        return instance_;
    }
}

たまにSingletonのサンプルでインスタンス
生成タイミングが上記のようになってるので注意。