【发布时间】:2013-07-12 08:20:47
【问题描述】:
我不明白为什么在下面的代码中使用这样的计时器变量。
问题一:在startTimer()和stopTimer()中,都有一个局部变量aTimer要在对定时器的操作之前使用,目的是什么?
问题2:在stopTimer()中,timer会被赋值为null,所以如果timer不为null,则表示该timer已经创建,当调用startTimer()时,timer不会被再次创建。这是检查计时器是否正在运行的最佳做法吗?通过将 null 分配给计时器,PMD 还会报告“NullAssignment”违规
private Timer timer;
private void startTimer() {
if (timer == null) {
Timer aTimer = timerFactory.createTimer(100000, null);
aTimer.setListener(this);
timer = aTimer;
}
}
private void stopTimer() {
if (timer != null) {
Timer aTimer = timer;
timer = null;
aTimer.cancel();
aTimer.setListener(null);
}
}
public void start() {
synchronized(..) {
startTimer();
}
}
public void stop() {
synchronized(..) {
stopTimer();
}
}
【问题讨论】:
-
不,不是。 “如何修复 pmd 违规“NullAssignment”?是我问的,但方向错误。谢谢。
-
什么方向?这两个问题都是您向我们提出的……
-
上一个问题导致解释了为什么 PMD 报告 Nullassignment 和 GC 收集。请在这个问题的问题 1 和问题 2 中找到我真正关心的问题
-
如果你重构,你应该考虑使用
ScheduledExecutorService来代替——Timerhas an undocumented "feature" which is dangerous,而且ScheduledExecutorService更容易使用 -
@fge 我不会称之为危险 - 这可能是设计使然(在下午 3 点运行任务不应该在下午 2 点运行,因为时钟已经改变) - 但 ScheduledExecutorService 无论如何都更强大。
标签: java refactoring