2011-02-03 11 views

答えて

7

シングルトンが 静的メソッドで

をインスタンス化している間に、これはそれを行うための通常の方法ですが、これはなしで、唯一の方法を意味しています。 Javaの1.5では

シングルトンの新バージョンでは、列挙型のシングルトンパターンです:

public enum Elvis{ 

INSTANCE // this is a singleton, no static methods involved 

} 

そして列挙型はコンストラクタ、メソッドやフィールドを持つことができるので、あなたは彼らにあなたが望むすべての不変の状態を与えることができます。

参考:


また、用語シングルトンは私の余地を残してnterpretation。シングルトンは、定義された範囲ごとに1つのオブジェクトがあることを意味するが、スコープは、物事の数になります

  • のJava VMクラスローダ(私を思い出させるためのサンパウロEbermann @感謝):この場合の使用enumsでまたはinitialize-through-static-inner-class patternです。もちろんこれは、通常、シングルトンが意味するものです。
    は注意が:複数のクラスローダによってロードされた場合、列挙型、および他のすべてのシングルトンが壊れています。
  • エンタープライズアプリケーション(この場合、コンテナ管理のシングルトンが必要です(Spring singleton beanなど)。これは(当然のか、VMごとに1つのオブジェクト)いくつかのVMあたりのオブジェクトまたは複数のVMごとに一つのオブジェクト
  • スレッド再び(
  • 要求/セッション、あなたがよ(ThreadLocalを使用)することができ私は何を忘れた
  • )、これを管理するためのコンテナが必要SpringSeamおよびいくつかの他の人があなたのためにそれを行うことができますか?

(それは通常、コンテナ管理のコンポーネントのための簡単ではありませんが)上記の溶液は、ショーンが指摘

+1

12秒でビート= [ – KitsuneYMG

+0

この例は有効なJavaから取られました;-) – darioo

+0

@darioo:はい、それは 'leaveTheBuilding()'メソッドがありません:-) –

1
public enum MySingleton { 
instance; 
//methods 
} 

//usage 
MySingleton.instance.someMethod(); 
5

独自の方法でそれぞれ、不変行うことができるのすべての良い方法です彼らの作成は高価でない場合はシングルトンを初期化します。あなたは「遅延ロード」能力にしたい場合は、需要ホルダーイディオムの初期に見て。

// from wikipedia entry 
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; 
    } 

} 
+0

うん、それは私が「static-initial-inner-class-initial-through-class」パターンと呼んだものです:-) +1 –

+0

@Sean:ああ、あなたは同じことを指しているとは思いませんでした。あなたの答えは本当に完璧だったと思います。 +1 :) –

1

複雑ではありません。不変であるためには、オブジェクトはいったん作成されると変更不可能でなければなりません。これは通常、「コンストラクタでのみ変更可能」を意味すると解釈されますが、それを変更不可能にする別の方法を作成する場合は、オブジェクトが初期化された後に変更できない限り、オブジェクトは変更不可能です。 Singletonインスタンスを初期化の一部として設定することを検討できます。

不変性の利点のほとんどは、シングルトンでは無関係です。

関連する問題