Java Singletonパターン、すべての変数はクラス変数である必要がありますか?
-
21-09-2019 - |
質問
クラスがシングルトンパターンを実装している場合、すべての変数を静的と宣言する必要がありますか?
静的と宣言されるべきではない理由はありますか?違いはありますか?
解決
いいえ。シングルトンパターンは、単一のインスタンスが唯一のインスタンスであることを意味します。「すべてを静的にアクセスできるようにする」ことを意味しません。
シングルトンパターンは、コードをテストしてリファクタリングする機能を犠牲にすることなく、「単一のインスタンス」のすべての利点を提供します。
編集:
私がやろうとしているポイントは、機能の消費方法(コンテキストに依存する)と機能の初期化方法の間に違いがあるということです。
ほとんどの場合、オブジェクトは単一のインスタンスしか持っていないことが適切かもしれません(たとえば、最終的な生産システムで)。ただし、他のコンテキスト(テストなど)もあり、唯一の選択肢であると強制するとはるかに困難になります。
また、静的なものを作ることは、「私のクラスの1つのインスタンスのみにアクセスできるはずです」よりも重要な意味を持っています。これは通常、意図です。
さらに、私が取り組んだソフトウェアでは、オブジェクトの初期化とライフサイクルは、しばしば他の誰かによって制御されます(私はここでDIについて話している)、静的なものを作ることは本当に役に立ちません。
他のヒント
1つの一般的なシングルトンパターンでは、あなたはそうします いいえ staticsを使用します。クラスをコーディングして通常のフィールドを使用し、コンストラクターで初期化してから、新しい実行を手配します MyClass()
一度、結果を静的な場所に保存します。
いいえ、通常は静的なのはシングルトン自体への参照です(また、JNDIや依存関係噴射コンテナなど、その参照を保存する他の方法もあります)。
フィールドを静的と宣言しない理由(シングルトンパターンでは、それらの1つのインスタンスしか必要ありません)は、これにより、通常のシングルトンクラスの別の、わずかに異なるインスタンスを作成する柔軟性が得られるためです。テストなどの特別な状況でそれを行うことをお勧めします。
たとえあなたがその柔軟性を必要としない場合でも、それをあきらめる理由はありません。フィールドを静的と宣言することは、あなたが失うことの利点はありません。
君は できる これを行います(必ずしもそうではありません したほうがいい)。しかし、シングルトンの場合でも、クラスレベルではなく、すべての変数をオブジェクトレベルにする傾向があります。
- ある時点で、シングルトンはそのクラスにとって悪い考えであり、クラスレベルの変数を持つことはリファクタリングを難しくするでしょう。
- オブジェクトレベルの変数を使用すると、シングルトンをインスタンス化するときにのみ存在します。クラスレベルでは、彼らは常にそこにいます。
結論:私はそれらをオブジェクトレベルとして持っていることの不利な点を考えることができなかったので、それが私がそれをする方法です。クラスレベルの上記の2つの欠点はごくわずかかもしれませんが、そこにいます。おそらく最終的には個人的な好みに帰着します。
ここでJavaでシングルトンを作成する方法(1つの可能な方法)を読むことができます。
Wikibooksデザインパターン:Java Singleton
基本的には、シングルトンとして何かを使用するつもりだという理由だけで、クラスのすべてのものを静的にする必要はありません(また)。いくつかの理由があります
- PaxdiabloとThiloの回答を確認してください
- また、すべての静的にすることを忘れないでください。すべてのコンストラクターを削除する必要があります(そしてデフォルトのコンストラクターをプライベートにする必要があります)