0

为了简化事情,假设我有一个界面RandomProvider界面

public interface RandomProvider
{
    double nextRandom();
}

假设我有这个接口的 3 个不同的实现,ARandom、BRandom、CRandom。我想收集一些关于实现的统计信息:

  • 多少次nextRandom()被调用
  • 生成的随机数的总和(听起来可能很傻,但这只是一个例子)。

最后这些统计数据将被记录到数据库中。这些是来自多个线程的大量使用的类,因此每次请求到来时都写入值是不可行的。

我想到的第一个想法是,我制作一个保存这些数据的单例,实现调用单例并增加必要的统计信息。另一个类从单例读取并将结果写入数据库并减少统计信息。但是我读过很多关于全局可变数据和单例是多么邪恶的文章,所以我害怕走这条路。

还有其他想法吗?

4

2 回答 2

2

是的,单例可能是一个邪恶的想法,但这取决于它们的用途。如果您使用单例只是为了使您的代码工作(允许它接触其他类,如全局中心对象),那么它很糟糕。

但最终您只是在寻找某种记录信息的方法(记录器),在这种情况下,使用单例记录这些数据甚至将其记录到一些文本/日志文件中并不是一个糟糕的决定。

于 2010-03-15T15:24:27.750 回答
2

您可以使用 AOP 记录该特定方法的所有调用。检查AspectJ。基本上,您将使用周围的建议拦截所有调用并收集统计数据并执行您的自定义操作(在这种情况下将随机数相加)。然后将其存储到数据库中。

于 2010-03-15T15:25:18.250 回答