2013-03-23 16 views
8

項目3(「専用コンストラクタまたは列挙型でシングルトンプロパティを強制する」)のブロッホ州として、単一要素の列挙型が最適な方法です。シングルトンを実装します。残念なことに、古いプライベートコンストラクタパターンは、非常に広まっており、多くの開発者が列挙型シングルトンを作成するときに何をしているのか理解していないという点があります。Java enumシングルトンのアノテーション

クラス宣言の上の単純な// Enum Singletonコメントは役に立ちますが、後で別のプログラマーが列挙型に2番目の定数を追加してシングルトンプロパティを破棄する可能性が残っています。プライベートコンストラクタのアプローチが持つすべての問題については、私の意見では、enumシングルトンよりもいくらか自己記述性が高いと言えます。

私は、enum型がシングルトンであり、コンパイル時にenumに1つの定数しか追加されないことを保証する注釈が必要だと思います。

@EnumSingleton // Annotation complains if > 1 enum element on EnumSingleton 
public enum EnumSingleton { 
    INSTANCE; 
} 

公共の図書館で標準のJavaのアノテーションをどこからでも実行できますか?それとも、Javaの現在の注釈システムの下で私が不可能なことを求めているのですか?私が使用している

UPDATE

回避策の一つは、私が実際に自分の注釈を転がりを気にすることを決定し、少なくともまで、INSTANCE場の正面に@SuppressWarnings("UnusedDeclaration")を置くことです。コードを単純な列挙型とは区別して見せかけることはまともです。

+1

私の視点から見ると、最も良い方法は、まずシンプルで明瞭でなければなりません。 – kapand

答えて

2

-

public class SingletonClass { 
    private SingletonClass() { 
     // block external instantiation 
    } 

    public static enum SingletonFactory { 
     INSTANCE { 
      public SingletonClass getInstance() { 
       return instance; 
      } 
     }; 

     private static SingletonClass instance = new SingletonClass(); 
     private SingletonFactory() { 
     } 

     public abstract SingletonClass getInstance(); 
    } 
} 

をそして、あなたのようにいくつかの他のクラスにアクセスすることができますプロジェクトに使用するコンパイル時のアノテーションを自分で定義することができます。もちろん、そのための注釈プロセッサを記述し、何らかの形で(antまたはmaven)を呼び出して、@EnumSingletonの列挙された列挙型を目的の構造のコンパイル時にチェックする必要があります。

ここにはcompile time annotationsの書き込み方法と使用方法に関するリソースがあります。

3

あなたはこのようなものを使用することができます - 私は公共のJavaライブラリで、このような注釈を認識してないんだけど、

SingletonClass.SingletonFactory.INSTANCE.getInstance(); 
+0

ありがとう!これは、プライベートコンストラクタの利点を融合させる興味深いアプローチです。確かに、それははるかに明白なシングルトンだという事実を作り出します。 :) 私に起こる何かは、列挙型のプライベートのデフォルトのコンストラクタでEnumSingleton.values()の長さをチェックすることです。不注意な人がある時点で別の定数を列挙型に追加しようとすると、少なくともRuntimeExceptionを投げることができます。 –

+0

@AndrewBissell単体テストは、クラスの動作を記述するのに役立つと考えられるので、単体テストのより良い候補だと思います。 – Jazzepi

+0

@ジャズピありがとう!列挙型が初期化される前に値の長さ()を読み込もうとしたときに、 "invokeExplosively"という行を持つ素晴らしいスタックトレースが得られました。 :)それほど多くのアイデアのために。 –

関連する問題