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のサンプルでインスタンスの
生成タイミングが上記のようになってるので注意。