2

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

検索を容易にするために、クラスには、単語とそれに関連付けられた定義を格納するメモリ内辞書であるメンバー変数が含まれています。ディクショナリは一度初期化されると決して変更できないと仮定します。ディクショナリは定数であり、インスタンス間で変化しません。

これは静的クラスの良い候補ですか? 静的クラスはステートレスであるべきだと読んでいます...しかし、このクラスには状態(メモリ内辞書)がありますよね?

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

ありがとう。

4

8 に答える 8

2

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

于 2009-03-18T17:01:30.313 に答える
1

他の人の回答を拡張するには、クラスのインスタンスが 1 つだけ必要な場合に静的クラスまたはシングルトンが役立ちます。これは、データが不変である場合にはるかに簡単に実現できます。したがって、これに使用したいのは静的クラスである可能性があります。しかし、自動的に使いたいものになるとは限りません。

私のアドバイスは、1 つの質問を自問することです。これらのオブジェクトを複数インスタンス化すると、世界は崩壊するのでしょうか? その場合は、シングルトンまたは静的クラスを使用してください。それ以外の場合は、通常のクラスを使用してください。

于 2009-03-18T17:06:33.450 に答える
1

ここで必要なのは静的クラスかもしれません(他の回答を参照)。ただし、辞書を「不変」と呼ぶのを間違えないでください。

不変は、「実行時に決して変更できない」という意味ではありません。これは Dictionary が実行時に実際に変更されるためです。作成した後、アイテムも追加する必要があります。この時点でも、二度と変更しないことを意図しているかもしれませんが、変更することは可能です。あなたの意図はどこにも適用されません。

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

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

于 2009-03-18T17:08:00.030 に答える
0

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

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

于 2009-03-18T17:23:21.227 に答える
0

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

于 2009-03-18T16:57:45.470 に答える
0

静的クラスは、「インスタンス」が 1 つだけ存在する必要がある場合に適しています。その場合、Singleton パターンがより適切である場合とそうでない場合があります (詳細によって異なります)。もちろん、複数のインスタンスが必要な不変オブジェクトの場合、静的クラスは不適切です。

于 2009-03-18T16:59:27.010 に答える
0

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

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

于 2009-03-18T17:00:22.123 に答える
0

Monostate パターンを説明しているように聞こえます。同じWebsterDictionaryものを全員で共有したいと考えています。たまたまWebsterDictionaryも不変ですが、それは直交する懸念事項です: 更新を不可能にするだけです (たとえば、読み取り専用ラッパーを使用して)。

于 2009-03-18T17:03:34.050 に答える