2009-09-30 2 views

答えて

6

おそらく、最善の方法は、単一のインスタンスで列挙型を使用することです。これにはシリアライズ可能でシリアン化とリフレクションに対するシングルトン性が保証されていますが、シンプルなシングルトン実装はありません(プライベート?私はリフレクションを持っています。

+0

+1アクセス修飾子での嘲笑。私は笑った。 :) – corsiKa

0

デフォルトでは、シングルトンはスレッドセーフではありません。シングルトンを作成する一般的な方法は、1つのインスタンスの作成を処理するファクトリメソッドを持つことです。そうすれば、インスタンスの作成を制御できます。

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

静的インスタンス変数を使用する方が、内部の "Holder"クラスよりも優先されます。もしあなたが好きなら、静的メンバをprivateにして、それにアクセスするためのメソッドを提供することもできますが、スタックに別のメソッド呼び出しを追加するだけです。

+0

これはむしろ、何が望ましいかによって異なります。ホルダーはあなたに怠惰なシングルトンを与えますが、単純なバージョンでは怠惰な読み込みができません。 –

+0

はい、そうです。 Javaは、最初に使用されるまでクラスをロードしません。 –

+1

完全に真実ではありません。最初に参照されたときに読み込みます。別のクラスのメソッドシグネチャに追加します。 – skaffman

1

lazy instanciationについて:getInstance()は、シングルトンを返します。最初の呼び出しであれば、シングルトンを返します。

public class MySingleton 
{ 
    private static MySingleton instance; 

    private MySingleton() 
    { 
     // construct object . . . 
    } 

    // For lazy initialization 
    public static synchronized MySingleton getInstance() 
    { 
     if (instance==null) 
     { 
      instance = new MySingleton(); 
     } 
     return instance; 
    } 

    // Remainder of class definition . . . 
} 
+1

レイジーインスタンス化はほとんど必要ありませんが、そうであれば、Javaはクラスを遅延ロードします。したがって、宣言でインスタンスを実際に作成する*遅延レイジングはありません(非常にまれなケースですが、 。 –

+0

この実装は、インスタンスへの参照を取得するすべての試行を同期します。ほとんどのコードは次のようになります: Singleton.getInstance.doSomething(); Singleton.getInstance.doSomethingElse(); 全体の効果は、メンバのアクセス/突然変異の点でスレッドの安全性が保証されていないため、同時同期が大幅に同時実行を制限することになります。 –

+0

javaでのダブルチェックロックが壊れているhttp://www.javaworld.com/jw-0220001/jw-0209-double.html 要するに、このクラスが一度しかインスタンス化されないことを保証するこの方法は、並行性の問題を見つけるのは困難です。これを決して使用しないでください。 – Buhb

11

シングルトンを作る最良の方法は?列挙型を使用します。

public enum Singleton { 
    INSTANCE; 
    public void foo(){ ... } 
} 

// Usage: 
Singleton.INSTANCE.foo(); 

VMの助けを借りて、二重インスタンス化を避けるだけでなく、逆シリアル化の破損を避けることもできます。

0

同時実行性を気にしている場合、共有グローバル状態は使用されません。

+2

シングルトンが特異並列化された問題からの結果の蓄積を保持するのであれば、なぜですか?シングルトンはグローバルな状態を表しており、公正な使用シナリオになります。 –

+1

プロセス間で共有されるインスタンスが1つのみで表されるクラスには、いくつかのユースケースがあります。Springを使った典型的なよく設計されたWebアプリケーションは、たぶん、ワーカースレッド間で共有されるシングルトンスコープでインスタンス化された一連のクラスを持つでしょう。 – Buhb

関連する問題