从类中收集信息的适当方式/模式是什么?

时间:2010-03-15 15:20:22

标签: java singleton immutability mutable data-collection

为了简化,我可以说我有一个接口RandomProvider接口

public interface RandomProvider
{
    double nextRandom();
}

并说我有3种不同的接口实现,ARandom,BRandom,CRandom。我想收集一些有关实现的统计信息:

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

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

我想到的第一个想法是,我创建一个包含这些数据的单例,实现调用单例并增加必要的统计信息。另一个类从单例中读取并将结果写入DB并递减统计信息。但是我读了很多关于全球可变数据和单身人士如何邪恶的文章,所以我害怕这样做。

还有其他想法吗?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

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