8

BlochがEffectiveJava2nd Editionの項目3(「プライベートコンストラクターまたは列挙型でシングルトンプロパティを適用する」)で述べているように、単一要素の列挙型はシングルトンを実装するための最良の方法です。残念ながら、古いプライベートコンストラクターパターンはまだ非常に広範で定着しており、列挙型シングルトンを作成するときに多くの開発者が私が何をしているのか理解できないほどです。

クラス宣言の上の簡単な// Enum Singletonコメントは役に立ちますが、それでも、別のプログラマーが後でやって来て、列挙型に2番目の定数を追加し、シングルトンプロパティを壊す可能性があります。プライベートコンストラクターアプローチが抱えるすべての問題について、私の意見では、列挙型シングルトンよりもいくらか自己文書化されています。

私が必要としているのは、列挙型がシングルトンであることを示し、コンパイル時に1つの定数のみが列挙に追加されることを保証するアノテーションです。このようなもの:

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

誰かがどこかの公共図書館で標準Javaのそのような注釈に出くわしたことがありますか?それとも、Javaの現在の注釈システムでは不可能だと私が求めていることはありますか?

アップデート

私が使用している回避策の1つは、少なくとも自分の注釈を実際にローリングすることに悩むまでは、フィールド@SuppressWarnings("UnusedDeclaration")の真正面に配置することです。INSTANCEこれは、コードを単純な列挙型とは異なるように見せるための適切な役割を果たします。

4

2 に答える 2

3

あなたはこのようなものを使うことができます-

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();
    }
}

そして、あなたは他のクラスで-としてアクセスすることができます

SingletonClass.SingletonFactory.INSTANCE.getInstance();
于 2013-03-23T23:43:26.143 に答える
2

パブリックJavaライブラリでこのようなアノテーションを認識していませんが、プロジェクトで使用するコンパイル時のアノテーションを自分で定義できます。もちろん、そのための注釈プロセッサを作成し、何らかの方法でAPTantまたはmaven@EnumSingletonを使用)を呼び出して、コンパイル時に目的の構造の注釈付き列挙型をチェックする必要があります。

コンパイル時の注釈を記述して使用する方法に関するリソースは次のとおりです。

于 2013-03-23T23:52:49.140 に答える