假设我的web应用程序中的普通java类中有一个方法。我想在5分钟内得到if和else块执行的计数。 你会怎么做?
答案 0 :(得分:3)
有几种方法可以实现目标。例如,您可以创建一个“计数器”类,它使用某个类/方法名称进行实例化。然后,无论何时输入,方法本身都会调用计数器。
这样做的缺点当然是你现在混合责任。您的业务方法应该执行业务工作。它不应该知道或做任何有关跟踪其调用的事情!
因此,这将是使用某种面向方面编程的一个很好的例子!含义:“计数”调用是一个方面,理想情况下,它定义并“附加”到方法,而不用在方法体中“手动”执行。因此,如果您使用的是支持AOP的Spring等框架,那么这将是首选的选项。
除此之外:在这里也可以使用某种 instrumentation 框架。你知道,任何合理的 profiler 都应该能够为你提供这样的数字。
因此,真正的答案是明确您的要求 - 因为有非常不同的选项,这取决于您打算在此解决的问题。
答案 1 :(得分:1)
在当前类中使用计数器+计时器是脏的:混合责任由GhostCast加下划线 使用AOP /生成的代理类是可能的,但对于这样一个简单的要求,它似乎有点过分。如果您需要计算10种或更多方法的调用,您应该认真考虑这些方法。
但是对于一种观察方法,我倾向于使用Observable / Observer模式,其中您要观察调用的类是Observable,我会移动计数器和计时器逻辑来重置Observer类中的计数器。
它会给这个问题:
1)观察者将自己注册到Observable中
2)Observable在每次调用时调用Observer
3)观察者因此增加计数器
4)观察者通过每5 mn的计时器重置计数器
答案 2 :(得分:0)
使用静态字段存储startTime,if-和elseCounters。每次执行检查5分钟是否已经消失:
if ((System.getTimeMillis() - startTime) > (5 * 60 * 1000)) {
reset fields;
print out the counters;
} else {
increase counters;
}