Java 什么';像这样使用计时器的目的是什么?

Java 什么';像这样使用计时器的目的是什么?,java,refactoring,Java,Refactoring,我不明白为什么在下面的代码中使用这样的计时器变量 问题1:在startTimer()和stopTimer()中,在对计时器进行操作之前都要使用一个局部变量aTimer,其目的是什么 问题2:在stopTimer()中,计时器将被分配为null,因此如果计时器不为null,这意味着已经创建了此计时器,则在调用startTimer()时,将不会再次创建计时器。这是检查计时器是否正在运行的最佳实践吗?通过将空值分配给计时器,PMD也会报告“空值分配”的违规情况 我的假设是,该对象的原始作者希望封装计时

我不明白为什么在下面的代码中使用这样的计时器变量

问题1:在startTimer()和stopTimer()中,在对计时器进行操作之前都要使用一个局部变量aTimer,其目的是什么

问题2:在stopTimer()中,计时器将被分配为null,因此如果计时器不为null,这意味着已经创建了此计时器,则在调用startTimer()时,将不会再次创建计时器。这是检查计时器是否正在运行的最佳实践吗?通过将空值分配给计时器,PMD也会报告“空值分配”的违规情况


我的假设是,该对象的原始作者希望封装计时器对象,这样您就不会在start()和stop()之间错误地重新创建它


这没有直接的附加值,但如果在一个经常使用的对象上与一大群人一起工作,这可能是为了防止不必要的访问弄乱信息或其他什么。

计时器是同步的,以防止线程干扰和内存一致性错误。同步计时器意味着:

  • 没有来自其他线程的线程干扰
  • 确保内存一致性
  • 确保对计时器的原子访问,其中计时器的外部线程无法访问计时器的中间状态。i、 要么完成动作,要么根本没有动作

您的代码相当于:

private boolean started = false;
private Timer timer;

public synchronized void start() {
    if (!started) {
        timer = timerFactory.createTimer(100000, null);
        timer.setListener(this);
        started = true;
    }
}

public synchronized void stop() {
    if (started) {
        timer.cancel();
        timer.setListener(null);
        started = false;
    }
}
它更简短,更容易理解(IMHO)。局部变量是多余的,因为您的代码是同步的,
timer
变量不能由两个线程同时访问


使用
timer
null
这一事实作为启动/未启动的标志,对于这样短的代码来说是可以的,但随着添加更多行,它将变得混乱。我更喜欢一个正确的
start
标志,它是不言自明的。

不,它不是。“如何修复pmd冲突”NullAssignment“?”由我提出,但方向错误。谢谢。什么方向?这两个问题都是您向我们提出的……前面的问题解释了为什么PMD报告Nullassignment和GC collection。请在这个问题的问题1和问题2中找到我真正关心的问题,如果你重构,你应该考虑使用<代码> StjeDeCuto Service < /代码>——更重要的是,<代码> StuteExtEcService Service < /代码>要容易得多。use@fge我不会说这很危险——这可能是故意的(在下午3点运行任务不应该在下午2点运行,因为时钟已更改)-但ScheduledExecutorService无论如何都更健壮。谢谢@assylias。这是我期望的答案,合理且有用。
private boolean started = false;
private Timer timer;

public synchronized void start() {
    if (!started) {
        timer = timerFactory.createTimer(100000, null);
        timer.setListener(this);
        started = true;
    }
}

public synchronized void stop() {
    if (started) {
        timer.cancel();
        timer.setListener(null);
        started = false;
    }
}