2

クラスがシングルトン パターンを実装する場合、すべての変数を静的に宣言する必要がありますか?

それらが静的であると宣言されるべきではない理由はありますか? 違いはありますか?

4

5 に答える 5

12

いいえ。シングルトン パターンは、単一のインスタンスが唯一のインスタンスであることを意味します。「すべてを静的にアクセス可能にする」という意味ではありません。

シングルトン パターンは、コードをテストしてリファクタリングする機能を犠牲にすることなく、「単一インスタンス」のすべての利点を提供します。

編集:

私が言おうとしているポイントは、機能の消費方法 (コンテキストに依存) と機能の初期化方法には違いがあるということです。

ほとんどの場合、オブジェクトが 1 つのインスタンスしか持たないことが適切な場合があります (たとえば、最終的な運用システムなど)。しかし、他のコンテキスト (テストなど) もあり、強制的にそれを唯一の選択肢にすると、はるかに困難になります。

また、何かを静的にすることは、「自分のクラスのインスタンスを 1 つだけアクセスできるようにする」よりも重要な意味を持ちます。これは通常、意図されています。

さらに、私が取り組んできたソフトウェアでは、オブジェクトの初期化とライフサイクルは他の誰かによって制御されることがよくあります (ここでは DI について話しています)。静的なものを作成しても、実際には役に立ちません。

于 2009-11-20T00:33:24.370 に答える
4

1 つの一般的なシングルトン パターンでは、静的を使用しません。通常のフィールドを使用するようにクラスをコーディングし、コンストラクターで初期化してから、new を 1 回実行するように調整しMyClass()、結果を静的な場所に格納します。

于 2009-11-20T00:33:48.560 に答える
3

いいえ、通常は静的であるのはシングルトン自体への参照だけです (JNDI や依存性注入コンテナーなど、その参照を格納する他の方法もあります)。

フィールドを static として宣言しない理由 (シングルトン パターンでは必要なインスタンスは 1 つだけですが) は、通常はシングルトン クラスのわずかに異なる別のインスタンスを作成する柔軟性が得られるためです。テストなどの特別な状況では、これを行うことができます。

その柔軟性が必要ない (と思う) 場合でも、あきらめる理由はありません。フィールドを static として宣言しても、失う利点はありません。

于 2009-11-20T00:42:11.497 に答える
1

これを行うことができます (必ずしもそうする必要はありません)。ただし、シングルトンの場合でも、すべての変数をクラスレベルではなくオブジェクトレベルにする傾向があります。理由は次のとおりです。

  • ある時点で、シングルトンはそのクラスにとって悪い考えであり、クラスレベルの変数を持つとリファクタリングが難しくなると判断するかもしれません。
  • オブジェクトレベルの変数では、シングルトンをインスタンス化するときにのみ存在します。クラスレベルでは、彼らは常にそこにいます。

結論: それらをオブジェクト レベルにすることのデメリットを考えたことがないので、そのようにしています。クラスレベルに対する上記の 2 つの欠点は、ごくわずかかもしれませんが、存在します。最終的には個人の好みで決まるのではないでしょうか。

于 2009-11-20T00:39:47.493 に答える
0

ここで、Java でシングルトンを作成する方法 (考えられる方法の 1 つ) について読むことができます。

Wikibooks デザイン パターン: Java シングルトン

基本的に、何かをシングルトンとして使用するつもりだからといって、クラス内のすべてのものを静的にする必要はありません (すべきでもありません)。いくつかの理由があります

  • paxdiablo と Thilo からの回答を確認してください
  • また、すべて静的にすることを忘れないでください。すべてのコンストラクターを削除する必要があります(そして、デフォルトのコンストラクターを非公開にする必要があります)。
于 2009-11-20T00:46:45.590 に答える