2012-07-12 7 views
10

質問What is an efficient way to implement a singleton pattern in Java?では、アップノートの回答が最も多く、シングルトンを実装するために列挙型を使用しています。サブクラスに従属するシングルトンを扱う

それは問題ありません。私は引数、それぞれの言語の利点を理解しています。

私はシングルトンを定義するクラスのセットを持っていますが、他のクラスを拡張する必要があります。のサブタイプはサブタイプではないので、これは不可能です。

ジョシュア・ブロックは、彼のスライドで述べている:

  • しかし、一つのことが欠けている、あなたがされるほとんどの場合、列挙型
    • を延長することはできません、あなたは
    • ワンいけません魅力的なユースケース操作コード

ほとんどの場合、次のようにしないでください。誰かがそれを詳しく説明できますか??私はいくつかのサーブレットを実装しており、それらはシングルトンでないのがなぜHttpServletであるのですか?私は自分のアプリケーションでそれらのインスタンスを1つだけ必要とします。

+0

シングルトンサーブレットが必要な理由を説明できますか(この選択肢につながった制約は何ですか?) – Romski

+0

@Romskiアプリケーションは、このサーブレットのインスタンスを1つだけ必要とします。 – Mahoni

+0

enumはインターフェイスを実装できます。委任では、これは、別のクラスで定義された機能を使用するインスタンスが1つしかないことを意味します。 –

答えて

7

シングルトンクラスは、他のクラスを拡張することができます。実際にJavaではデフォルトではObjectを拡張します。しかし、Joshが言及しているのは、Singletonクラスを拡張すると1つ以上のインスタンスが存在するため、Singletonクラスを拡張しないでください。コメントに答える

実際にシングルトンを実装するための最良の方法は次のとおりです。

効果的なJavaから

// Singleton with static factory 
public class Elvis { 
private static final Elvis INSTANCE = new Elvis(); 
private Elvis() { ... } 
public static Elvis getInstance() { return INSTANCE; } 
public void leaveTheBuilding() { ... } 
} 

ここでエルヴィスは他のクラスを拡張することができます。

+0

そして、それはenumイディオムでサーブレットを実装するのにどのように役立ちますか?列挙型を使用して実装されたシングルトンクラス**は**他のクラスを拡張することはできません。 – Mahoni

+0

いいえ、 "有効なJava"のオンライン部分は、enumのアプローチに言います。 >>このアプローチは、より簡潔でシリアライズ機構を無料で提供し、洗練されたシリアライゼーションやリフレクション攻撃に直面していても、複数のインスタンス化に対する厳密な保証を提供する点を除き、パブリックフィールドアプローチと機能的に同等です。このアプローチはまだ広範に採用されていませんが、単一要素列挙型はシングルトンを実装する最善の方法です** << – Mahoni

+2

おそらく、より良い方法の一つと言えばよかったでしょう。しかし、あなたのために、あなたが拡大したいので、これは最善の方法でしょう。 – user1168577

1

Joshは、シングルトンタイプを拡張するのではなく、列挙型を拡張することを指しています。

+0

しかし、私はサーブレットを列挙型のシングルトンのイディオムで実装することはできません。このように、 'HttpServlet'をサブクラス化することはできません:' public enum MyServlet extends HttpServlet'は許されません。私は自分のシングルトンを拡張したくない、私は自分のシングルトンが別のクラスを拡張させたい。 – Mahoni

+0

はい、明らかです。私が言っていることは、ジョシュはこの引用でこの問題に対処していないということです)この場合、enumイディオムを使用できないことは明らかです。問題は何ですか? –

3

サーブレットの実際のインスタンスを気にする必要はありません。ライフサイクル管理は、あなたが同意したサーブレット仕様契約に従ってサーブレットコンテナによって処理されます。サーバー側の機能の一部をシングルトンとして実装することが理にかなっている場合は、先に進み、好きな方法でサーブレットから使用してください。

+0

それは理にかなっています! – Mahoni

+0

この質問は私の問題を解決しましたが、私の質問がより一般的だったので、私は他のものを例外としてチェックすることにしました。とにかくありがとう! – Mahoni