クラスがシングルトン パターンを実装する場合、すべての変数を静的に宣言する必要がありますか?
それらが静的であると宣言されるべきではない理由はありますか? 違いはありますか?
クラスがシングルトン パターンを実装する場合、すべての変数を静的に宣言する必要がありますか?
それらが静的であると宣言されるべきではない理由はありますか? 違いはありますか?
いいえ。シングルトン パターンは、単一のインスタンスが唯一のインスタンスであることを意味します。「すべてを静的にアクセス可能にする」という意味ではありません。
シングルトン パターンは、コードをテストしてリファクタリングする機能を犠牲にすることなく、「単一インスタンス」のすべての利点を提供します。
編集:
私が言おうとしているポイントは、機能の消費方法 (コンテキストに依存) と機能の初期化方法には違いがあるということです。
ほとんどの場合、オブジェクトが 1 つのインスタンスしか持たないことが適切な場合があります (たとえば、最終的な運用システムなど)。しかし、他のコンテキスト (テストなど) もあり、強制的にそれを唯一の選択肢にすると、はるかに困難になります。
また、何かを静的にすることは、「自分のクラスのインスタンスを 1 つだけアクセスできるようにする」よりも重要な意味を持ちます。これは通常、意図されています。
さらに、私が取り組んできたソフトウェアでは、オブジェクトの初期化とライフサイクルは他の誰かによって制御されることがよくあります (ここでは DI について話しています)。静的なものを作成しても、実際には役に立ちません。
1 つの一般的なシングルトン パターンでは、静的を使用しません。通常のフィールドを使用するようにクラスをコーディングし、コンストラクターで初期化してから、new を 1 回実行するように調整しMyClass()
、結果を静的な場所に格納します。
いいえ、通常は静的であるのはシングルトン自体への参照だけです (JNDI や依存性注入コンテナーなど、その参照を格納する他の方法もあります)。
フィールドを static として宣言しない理由 (シングルトン パターンでは必要なインスタンスは 1 つだけですが) は、通常はシングルトン クラスのわずかに異なる別のインスタンスを作成する柔軟性が得られるためです。テストなどの特別な状況では、これを行うことができます。
その柔軟性が必要ない (と思う) 場合でも、あきらめる理由はありません。フィールドを static として宣言しても、失う利点はありません。
これを行うことができます (必ずしもそうする必要はありません)。ただし、シングルトンの場合でも、すべての変数をクラスレベルではなくオブジェクトレベルにする傾向があります。理由は次のとおりです。
結論: それらをオブジェクト レベルにすることのデメリットを考えたことがないので、そのようにしています。クラスレベルに対する上記の 2 つの欠点は、ごくわずかかもしれませんが、存在します。最終的には個人の好みで決まるのではないでしょうか。
ここで、Java でシングルトンを作成する方法 (考えられる方法の 1 つ) について読むことができます。
Wikibooks デザイン パターン: Java シングルトン
基本的に、何かをシングルトンとして使用するつもりだからといって、クラス内のすべてのものを静的にする必要はありません (すべきでもありません)。いくつかの理由があります