10

Javaでシングルトンパターンを実装する効率的な方法は何ですか?賛成票が最も多い答えは、シングルトンを実装するために Enum を使用することです。

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

ただし、シングルトンを定義しているが他のクラスを拡張する必要がある一連のクラスがあります。列挙型はサブクラス化できないため、列挙型アプローチではこれは不可能です。

Joshua Bloch はスライドで次のように述べています。

  • ただし、1 つ足りないことがあります。列挙型を拡張することはできません。
    • ほとんどの場合、あなたはすべきではありません
    • 説得力のあるユース ケースの 1 つ - オペレーション コード

ほとんどの場合、すべきではありません:誰かがそれについて詳しく説明できますか? 私はいくつかのサーブレットを実装しましたが、それらは を拡張していHttpServletます。アプリケーションでそれらの 1 つのインスタンスのみが必要です。

4

3 に答える 3

7

Singleton クラスは他のクラスを拡張できます。実際、Java ではデフォルトで Object を拡張します。ただし、ジョシュが言及しているのは、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() { ... }
}

ここで、Elvis は他のクラスを拡張できます。

于 2012-07-12T13:45:22.910 に答える
3

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

于 2012-07-12T13:44:52.950 に答える
1

Josh は列挙型を拡張することを指していて、シングルトン型を何か他のものに拡張することを指しているわけではありません。

于 2012-07-12T13:40:23.733 に答える