2

java シングルトンを実装するさまざまな方法について、stackexchange で別の記事を見つけました。示されている方法の 1 つを次の例に示します。それは非常に低い投票されました。理由を理解したかった。 Javaでシングルトンパターンを実装する効率的な方法は何ですか?

public class Singleton {

    private static Singleton instance = null;

    static {
          instance = new Singleton();
          // do some of your instantiation stuff here
    }

    private Singleton() {
          if(instance!=null) {
                  throw new ErrorYouWant("Singleton double-instantiation, should never happen!");
          }
    }

    public static getSingleton() {
          return instance;
    }

}
4

3 に答える 3

5

@クレイグがコメントで言っているように:

違います。静的変数は、クラスがロードされるときに静的ブロックと共に初期化されます。宣言を分割する必要はありません。

基本的に、それは誤った情報であったため、反対票を投じられました。彼が言ったことの多くは、明らかに真実ではありませんでした。具体的には、静的メソッドを使用した静的変数の初期化は、クラスがロードされたときに発生しますが、作成者はそうではないと主張しました。

彼の議論もあまり意味がありません。「データの挿入」はコンストラクター内で行うことができます。

そうは言っても、上記のコードは問題なく機能します。これは奇妙な方法であり、間違いなく最も文体的ではありません。

于 2013-01-18T00:58:40.510 に答える
1

次の解決策は、スレッドセーフであることを確認してください

public class Singleton {
    // Private constructor prevents instantiation from other classes
    private Singleton() { }

    /**
    * SingletonHolder is loaded on the first execution of Singleton.getInstance() 
    * or the first access to SingletonHolder.INSTANCE, not before.
    */
    private static class SingletonHolder { 
            public static final Singleton INSTANCE = new Singleton();
    }

    public static Singleton getInstance() {
            return SingletonHolder.INSTANCE;
    }

}

于 2013-01-18T00:57:42.113 に答える
0

これは、それを実装する良い方法ではありません。

静的変数は JVM のロード時に初期化されるため、シングルトンを final にするだけです。

public final class Singleton
{ 
    private static final Singleton INSTANCE = new Singleton();

    private Singleton()
    {
        // build it
    }

    public static Singleton getInstance()
    {
        return INSTANCE;
    }
}
于 2013-01-18T01:05:20.847 に答える