15

私はEffectiveJavaを読みましたが、シングルトンはを使用して実装するのが最適であると述べられていenumます。

このアプローチは、より簡潔で、無料のシリアル化機構を提供し、高度なシリアル化またはリフレクション攻撃に直面した場合でも、複数のインスタンス化に対する強力な保証を提供することを除いて、パブリックフィールドアプローチと機能的に同等です。このアプローチはまだ広く採用されていませんが、シングルエレメント列挙型はシングルトンを実装するための最良の方法です。

それでも、これはオンザフライのシリアル化と真のシングルインスタンスを実現するためのトレードオフのように見えますが、従来のシングルトンのよりフレンドリーなOOPアプローチを失います。列挙型は継承できず、インターフェイスのみを実装できます。スケルトンクラスを提供する場合は、ヘルパークラスを作成する必要があります。

では、上記の理由以外に、なぜ列挙型をシングルトンの最良の実装として受け入れる必要があるのでしょうか。

4

3 に答える 3

16

これは、オンザフライのシリアル化を実現するためのトレードオフのようです

私にとっては、次のようなものを書く方がはるかに簡単で簡潔です。

enum Singleton {
    INSTANCE;
}

より多くのコードを記述したり、複雑さを導入したりする必要がある場合は、そうしてください。ただし、これが必要になることはめったにありません。

古典的なシングルトンのよりフレンドリーなOOPアプローチを失います。

フィールドを使用する方が簡単だと思います。

列挙型は継承できません、

本当ですが、複数のシングルトンを持っていること自体が疑わしいです。列挙型は、ある実装を別の実装に交換できるようにするインターフェースから継承できます。

スケルトンクラスを提供する場合は、ヘルパークラスを作成する必要があります

ヘルパークラスには状態がありません。スケルトンクラスにはいくつかの状態がある場合があり、その場合は委任が必要です。

ところで:あなたはenumヘルパークラスに使うことができます

enum Helper {;
    public static my_static_methods_here;
}

シングルトンの最良の実装として列挙型を受け入れる必要があるのはなぜですか

私はYAGNIの原則に従います。あなたが必要とするかもしれないとあなたが想像するものではなく、あなたが必要とするものだけを開発してください。

于 2012-08-06T16:38:22.347 に答える
16

列挙型は継承できません

そして、それはシングルトンである列挙型の最良の部分の1つです。

シングルトンから継承できる場合、それはもはやシングルトンではありません。

于 2012-08-06T21:03:46.610 に答える
11

しばらく前にstackoverflowで同様の議論がありました:Javaでシングルトンパターンを実装するための効率的な方法は何ですか?

受け入れられた答えは、そのトピックに関する良いリンクを提供します:

Joshua Blochは、Google I / O2008でのEffectiveJavaReloadedの講演で、このアプローチについて説明しました:ビデオへのリンク。彼のプレゼンテーションのスライド30〜32(effective_java_reloaded.pdf)も参照してください。

重要な点は、実際のシングルトンであるシングルトンを作成するのは非常に難しいということです。列挙値は、Java言語仕様§8.9で定義されているように1回だけ存在することが保証されています。

列挙型には、列挙定数で定義されたインスタンス以外のインスタンスはありません。

于 2012-08-06T16:39:24.577 に答える