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


85

SOの質問で書かれたものに基づいて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()

回答:


96

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

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


1
列挙型を気にしないのはなぜですか?java5 +でシングルトンを実行するためのより良い方法はありますか?
jontro 2011年

4
@jontroは答えを(再)読みます。彼は、シングルトンが必要な場合は列挙型を使用するが、静的メソッドで実行できる場合はシングルトンを回避するように言っています
悲惨な変数

@MiserableVariable私は1年以上前にこれについてコメントしました。カントは、私が言及していた文脈を本当に覚えています。
jontro 2013年

尋ねられた質問に答えない
Thufir 2013

2
@Thufir:それは「違いは何ですか」の部分に答えます-答えが受け入れられたことを考えると、これはOPが最も興味を持っていたもののようです。
Jon Skeet 2013

69

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

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

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

と:

public interface HasAge {
    public int getAge();
}

静力学ではできません...


1
静的で実行できます... public static final HasAge INSTANCE = new HasAge(){private int age; @Override public int getAge(){return age; }}; ...だから私はまだ列挙型メソッドについて何が良いのか良いのか疑問に思っています。2つのインターフェースを実装する必要があると思いますか?
ショーンアドキンソン2013

9

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


8

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.