web-dev-qa-db-ja.com

JavaでシングルトンとしてEnumを使用するための最良のアプローチは何ですか?

SO question Javaでのシングルトンの最適な実装 -つまり、列挙子を使用してシングルトンを作成することについて-の違い/長所/短所は何ですか?] (コンストラクター省略)

_public enum Elvis {
    INSTANCE;
    private int age;

    public int getAge() {
        return age;
    }
}
_

そしてElvis.INSTANCE.getAge()を呼び出します

そして

_public enum Elvis {
    INSTANCE;
    private int age;

    public static int getAge() {
        return INSTANCE.age;
    }
}
_

そしてElvis.getAge()を呼び出します

85
Miles D

与えられたオブジェクトのプロパティを使用するものにバインドしていると仮定します-Elvis.INSTANCEを簡単に渡すことができますが、Elvis.classを渡してプロパティを見つけることを期待することはできませんクラスの静的プロパティ)。

基本的には、wantインスタンスの場合にのみシングルトンパターンを使用します。静的メソッドが問題なく機能する場合は、それらを使用するだけで、列挙を気にしないでください。

95
Jon Skeet

大きな利点は、シングルトンがインターフェイスを実装する必要がある場合です。あなたの例に従って:

public enum Elvis implements HasAge {
    INSTANCE;
    private int age;

    @Override
    public int getAge() {
        return age;
    }
}

と:

public interface HasAge {
    public int getAge();
}

静的にはできません...

68
Nicolas

(ステートフル)シングルトンは通常、静的変数を使用しないふりをするために使用されます。実際にパブリックに静的な変数を使用しない場合、だまされる人が少なくなります。

私は最も簡単で明確なオプションを選択します。これは多少主観的ですが、最も明確なものがわからない場合は、最短のオプションを選択してください。

8
Peter Lawrey