質問

単語を取得してその定義を返すことができる関数を持つWebsterDictionaryという単純なクラスがあるとします。おそらく、定義を取得して単語を返すことができる別の関数があります。このクラスは、多くのクライアントによって常に使用されています。

ルックアップを容易にするために、クラスには、単語とそれに関連する定義を保存するメモリ内ディクショナリであるメンバー変数が含まれています。ディクショナリは、初期化された後は決して変更できないと仮定します-定数であり、インスタンス間で変化しません。

これは静的クラスの良い候補ですか?静的クラスはステートレスであるべきだと読んでいますが、このクラスには状態(メモリ内ディクショナリ)がありますか?

編集:また、これが静的クラスになった場合、コンストラクタがなくなるため、いつ辞書を初期化しますか?静的メソッドの1つが呼び出されるたびに、ディクショナリへの参照がnullであるかどうかを確認しますか?

ありがとう。

役に立ちましたか?

解決

静的クラスは、機能を交換可能にする必要がない場合(テストなど)に適しています。スタブまたはモックを使用する場合は、適切なインターフェイスを作成し、シングルトンで実装する必要があります。

他のヒント

他の人の答えを拡張するには、クラスのインスタンスを1つだけ持つ必要がある場合に、静的クラスまたはシングルトンが便利です 。これは、データが不変の場合に達成するのがはるかに簡単です。したがって、静的クラスがこれに使用したい可能性があります。しかし、それは必ずしもあなたが使いたいものであるというわけではありません。

1つの質問を自問することをお勧めします。これらのオブジェクトを複数インスタンス化すると、世界がクラッシュしますか?その場合、シングルトンまたは静的クラスを使用します。それ以外の場合は、通常のクラスを使用します。

ここで必要なのは静的クラスです(他の回答を参照)。ただし、辞書を<!> quot; immutable <!> quot;と呼ぶのを間違えないでください。

Immutableは、<!> quot;実行時に変更できないことを意味しません<!> quot;辞書は実際には実行時に変更するため、フレーズを使用したという意味で。作成する必要がある場合は、アイテムも追加する必要があります。この時点でも、再び変更しないことを意図することがありますが、変更することは可能です。あなたの意図はどこにも適用されません。

真に不変なオブジェクトは、作成後も変更することはできません。代わりに、オブジェクトのバリエーションが必要な場合は、目的の属性を持つ新しいインスタンスを作成する必要があります。

静的クラスは、ある意味では、インスタンスが1つだけであると考えることができます。おそらく、状態が変化するたびに新しいインスタンスを作成することに依存しているパターンには、これは最良の選択ではありません。

シングルトンまたは静的クラスのいずれかを選択できます。私はおそらくシングルトンに行きますが、この特定の状況では主に好みの問題だと思います。

<!> quot; instance <!> quotが1つだけの場合、静的クラスが適切です。存在する必要があります。その場合、Singletonパターンの方が適切な場合とそうでない場合があります(詳細に応じて)。複数のインスタンスが必要な不変オブジェクトの場合、もちろん静的クラスは不適切です。

探しているのはシングルトンかもしれませんか?

静的クラスが状態を持つ必要はありません(その一部として静的メンバーを持つことができ、状態の一部になることができます)。

モノステートパターン :同じWebsterDictionaryを全員で共有したい場合。たまたま<=>も不変ですが、それは直交する懸念です。更新できないようにするだけです(たとえば、読み取り専用ラッパーを使用することによって)。

おっしゃるように、クラスは読み取り専用であっても、何らかの形のグローバル状態を保持しています。シングルトンアプローチを採用すると、データを保持していることが明確になります。

依存性注入を使用する場合、すべてのクラスにインスタンスを取得するコードを持たせる代わりに、シングルトンインスタンスを注入することができます。これは、他のクラスがシングルトンのアプローチに結び付けられないことを意味し、テスト時により簡単に置き換えることができる場合(テストモックとの置き換えを可能にするインターフェイスと組み合わせて)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top