2011-12-19 17 views
2

すでにありましたaskedシングルトンと静的クラスの違いは何ですか?しかし、違いを知って、私はまだ私が選ぶ必要があるときはいつも混乱していると感じます。シングルトンと静的クラスのケーススタディ

私は、このクラスのインスタンスが1つだけ(非常にまれである)、すべてのサービスクラスの静的クラスが必要な場合は、主にPOJOクラス(Javaの場合)にシングルトンを使用していますこれは非常に頻繁に起こる)。

たとえば、私のアプリケーションでは、メッセージを保存する必要があります(シリアライズ可能なクラスのMessageがあります)、ファイルに書き込んだり、ファイルから読み込んだり、ランタイム中にアクセスしたりする必要があります。ここでシングルトンを使用する理由はありません。静的クラスは大丈夫です。静的な唯一のクラスは、read、write、getMessagesの3つの機能を持つMessageStorageと、メッセージの静的なprivate arraylistです。

このアプローチは妥当かどうか、またそうでない場合、その問題は何ですか?

+2

グローバルステート/スタティックステートは一般的に悪いフォームと見なされるため、シングルトンはしばしば[反パターン]とみなされます(http://en.wikipedia.org/wiki/Singleton_pattern#Drawbacks)。 "良い習慣"は、静的なクラスとシングルトンは、状態のないヘルパーメソッド(例えば、 'Math.sqrt(4)')にしか使われないということです。 – Bringer128

+0

この場合、あなたは何をしますか? – Sergey

+0

ステートが保存されている必要がある場合は、オブジェクトへの参照を1つだけ持つことになります。それはシングルトンパターンでは保証されませんが、情報を必要とするものによってグローバルに到達可能な場所に存在します。それは同じ効果を達成するだろうが、私のポストで述べたように、違いはスケーラビリティであり、変更可能性は要求の変化に対応して改善される。クラスを作成するとシングルトンのゴールが達成されます。あなたがする必要があるのは、世界的に見つかる場所での参照です。 – Dessus

答えて

1

2つの主な理由は、次のとおり

1)ので、いくつかのストレージは、他に「静的」クラスに関連付けることができます。

2)特定のサービスのさまざまなサブクラス(またはインターフェイス実装)に複数の「シングルトン」があり、シングルトンは、使用する特定のサービスを識別する方法として渡されます。

もちろん、#1の代わりに静的なクラスの静的フィールドを使用してデータを格納することはできますが、多くの場合、より効率的であるため、データを格納するクラス、他のクラスのインスタンスである複数の静的なメンバ

そして、re#2では、1つのクラスのJDK内に複数の「シングルトン」を実装するケースが数多くあります。

一般に、Javaは真のクラス関連(クラス保護された)静的な実装であるため、シングルトンを持つ動機はCベースの言語よりもJavaでは少なくなります。 C言語で使用されている漠然とした(偽装されていれば)グローバルな統計情報と比較して、クラス内に複数の静的フィールドを持つことができるだけでなく、C言語のフィールドを格納する "中央" 。

1

  • MessageStore :-)理想的な設計は、即ち、getMessageStore()は同じメッセージストアを毎回返す場合
  • MessageStoreFactoryは(getMessageStore()メソッドとシングルトンでなければならないインタフェースであるべきです問題ではなく、あなたはシングルトンを持っています)。あなたがそのようななどFileMessageStore、JDBCMessageStore、SubversionMessageStore、などの複数のMessageStoreの実装、...
  • が最も重要なのは、あなたが、MockMessageStoreを持つことができていることができ、メッセージストアをモックすると、メッセージに依存するコンポーネントをテストすることができるよう
  • メッセージストアとは独立して格納します(そして、障害を分離します)。たとえば、MessageViewをテストしてエラーが発生した場合、MessageViewにエラーがあり、MockMessageStoreが正しい場合は静的MessageStoreではないことを確認できます。とにかく、クールな子供は日今やっていることだ...と依存性注入ではなく、工場が、一歩ずつ

...

+0

依存性注入+1 – Dessus

1

本当にここに理解する事がありということですc#/ javaの異なるメモリグループです。

すべてのクラスは、クラスローダーメモリと呼ばれるメモリセクションにロードされます。静的なものを作ると、それはクラスローダーのメモリに残ります。そこから使用できますが、1つのインスタンスしか持てません。クラスローダーメモリ用のガベージコレクタはありません。アプリケーションの存続期間中、すべてがそこにとどまります。

シングルトンであろうとなかろうと、クラスのインスタンスを作成することは、メモリコピーが行われたことを意味します。クラスローダーメモリからクラスをコピーし、インスタンスが格納されている領域にコピーします。インスタンスはガベージコレクションできます。

シングルトンのオプションと静的クラス間の実際の判断ポイントは次のとおりです。

1)あなたはシングルトンをしたいそうだとすれば、あなたが相続、またはあなたのクラスのためのインタフェースを(したいですか)
2)それは意味を成していますあなたのクラスがあなたのアプリケーションと同じライフサイクルを持つことを強制する(つまり、クラスを手作業でクリアするか、それを行うためのメソッドを書く必要があります。 (そうでない場合はシングルトンが必要です)
3)アプリケーションにはスケーラビリティと変更の可能性がありますか?現在のところ、シングルトンはアンチ・パターンとみなされ、IFは静的なプロパティを介して実装されます。この理由は、単一ウィンドウアプリケーションが突然マルチウィンドウになり、コードを書き直す必要があるため、クラスに静的インスタンスプロパティを公開するなどのインフラストラクチャに投資することです。 (コードの書き換えは、特にコアインフラストラクチャの場合には、悪い設計を示しています)。親指の一般的なルールとして

、私は次のことをお勧めします:

  • シングルトンであるべきクラス全体の変数は、(理由は潜在的にそれをスケールアウトする必要性)が存在する任意のクラスを。
  • 各メソッドがそれぞれ独立しているクラスはすべて静的である必要があります。 Javaで「シングルトン」を使用するための
関連する問題