0

物事を単純化するために、私はインターフェースRandomProviderインターフェースを持っているとしましょう

public interface RandomProvider
{
    double nextRandom();
}

そして、このインターフェイスの 3 つの異なる実装、ARandom、BRandom、CRandom があるとします。実装に関するいくつかの統計を収集したいと思います。

  • 何回nextRandom()呼ばれるか
  • 生成された乱数の合計 (ばかげているように聞こえるかもしれませんが、これは単なる例です)。

最終的に、これらの統計は DB に記録されます。これらは複数のスレッドから頻繁に使用されるクラスであるため、リクエストが来るたびに値を書き込むことは現実的ではありません。

私の頭に浮かぶ最初のアイデアは、これらのデータを保持するシングルトンを作成し、実装がシングルトンを呼び出し、必要な統計を増やすというものです。別のクラスがシングルトンから読み取り、結果を DB に書き込み、統計を減らします。しかし、グローバルに変更可能なデータとシングルトンがいかに悪であるかについての記事をたくさん読んだので、このように進むのが怖いです。

他のアイデアはありますか?

4

2 に答える 2

2

はい、シングルトンは悪い考えになる可能性がありますが、それはその用途に依存します。コードを機能させるためだけにシングルトンを使用する場合 (グローバル セントラル オブジェクトなどの他のクラスにアクセスできるようにする場合)、それは悪いことです。

しかし、最終的には、情報をログに記録する方法 ( logger ) を探しているだけであり、この場合、シングルトンを使用してこのデータをログに記録したり、テキスト/ログ ファイルにログを記録したりすることは悪い決定ではありません。

于 2010-03-15T15:24:27.750 に答える
2

AOP を使用して、その特定のメソッドのすべての呼び出しを記録できます。AspectJを確認してください。基本的には、アラウンド アドバイスを使用してすべての呼び出しをインターセプトし、統計を収集してカスタム操作を実行します (この場合は乱数を合計します)。次に、これを db に格納します。

于 2010-03-15T15:25:18.250 に答える