0

LDAP からすべてのユーザーのリストなどの詳細を読み取る必要がある状況があります。これは一度だけ発生するはずです。後で、特定のインスタンスの一連のアクティブ ユーザーにアラートを送信するなど、他の操作にこのリストを使用します。このメソッドは、複数のスレッドからさまざまな目的で呼び出されます。確認する必要があるのは、LDAP に送信される要求が 1 つだけであることだけです。

これを実現するためにシングルトン クラスを使用しました。オブジェクトの作成中に LDAP から詳細を取得します。このオブジェクトを使用して、そのアプリケーションのアクティブなユーザーのリストを見つけます。

このシナリオでは:

  1. 本当にシングルトン クラスを作成する必要がありますか?
  2. LDAP 読み取りメソッドにチェックを追加して、リストを要求する前にリストが空であることを確認することにより、すべての静的メソッドを持つクラスを使用してこれを実現できますか? 複数のスレッドでどのように機能しますか?
4

4 に答える 4

1

私の見解では、シングルトンを使用すると、相互および/または外部データに依存する可能性のある変数の初期化を実行できます。

静的変数を使用すると、たとえば、ファイルからこれらの項目にデータを簡単にプリロードすることはできません (または、別のオブジェクトでそれを行うと、更新が必要になった場合にデバッグがはるかに困難になります)。

より良いビューを持った賢い人がたくさんいると思いますが、私は常に静的変数よりもシングルトンを選びます。ビルド時に変更する可能性のある定義と、シングルトン参照を保持するためにのみ、静的を使用します。

また、スレッドに関しては、シングルトンを使用すると、必要に応じてミューテックスを配置できるため、データを安全に変更できることがわかります。静的を使用している場合、最初はこの機能が必要ない場合がありますが、後で必要になる可能性があり、レトロフィットがはるかに難しくなります。

これは主にコーディング スタイルであり、これが選択に役立つことを願っています。

于 2013-01-21T14:38:47.210 に答える
0

Theodoros Chatzigiannakisの回答にコメントする許可がまだないので、ここに私の回答/コメントがあります。彼が言ったように、シングルトン変数または静的変数を使用することで、テストを構築するのが難しく、コード内の依存関係を隠す可能性のあるグローバル状態を導入しています。経験豊富な人から:GoogleTechTalkビデオ

シングルトンの代わりに、クラスのインスタンスを1つ作成し、LDAPを1回呼び出します。「1回」の制限はクラス内で監視され、誤って呼び出された場合は例外をスローする可能性があります。

于 2013-01-21T15:03:51.673 に答える
0

シングルトン パターンを実装するか静的クラスを実装するかにかかわらず、注意事項はほとんど同じです。どちらの場合も、データ競合が適切に処理されていることを確認する必要があります (おそらくロックまたはユース ケースに適合するメカニズムを使用)。 . これら 2 つのアプローチの最も重要な違いは、変数の初期化の時間と、その初期化に対するユーザーの制御です (ここではシングルトンが優先されます)。

そうは言っても、どちらの場合も、グローバル状態をプログラムに挿入しようとしています。すでに何度も聞いたことがあるかもしれませんが、繰り返す価値があります。グローバルな状態を持つことは、特にマルチスレッド アプリケーションでは良い考えではありません。

于 2013-01-21T14:40:02.307 に答える
0

ほとんどの場合、静的変数よりもシングルトンを使用することをお勧めします。シングルトンは実際のオブジェクト指向のアプローチであり、いくつかのインターフェースを実装し、そのクラスを後で派生させることができます。

あなたが何を作っているか(シングルトンまたは静的変数)は計り知れません。それがあなたにとって重要な場合、コードはスレッドセーフでなければなりません。

于 2013-01-21T14:41:36.793 に答える