2

以下代码的PMD 报告NullAssignment,修复它的最佳实践是什么?

将 Object 分配给 null 是一种代码异味。考虑重构。

下面的代码不是我写的,我还有一个问题,为什么要创建一个临时的定时器实例,然后把这个实例赋值给定时器呢?startTimer并将stopTimer在多线程上下文中使用。

private Timer timer;

private void startTimer() {
    if (timer == null) {
        Timer aTimer = timerService.createTimer(DEFAULT_TIMER_VALUE, 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();
  }
}
4

3 回答 3

3

在搜索其他信息时到达此帖子,并注意到以前的答案都不正确(IMO)。

在提供的代码中分配空值的原因显然不是垃圾收集,而是能够停止和重新创建新的计时器,一次只能有一个计时器。

我看不出在stopTimer方法上使用临时变量的任何理由,但看起来与原始问题无关。

我会说这段代码很好,SuppressWarnings("PMD.NullAssignment")可以添加注释以避免违规;PMD 只是强调空分配通常是一种气味,而不是任何问题的事实。

于 2020-06-29T16:49:04.040 回答
1

这段代码写的是错误的,认为设置为的引用null被垃圾收集得更快。

因此,来自 PMD 的信息是,这种错误的信念被编码了。

这是一个错误的假设,因为垃圾收集器在内存耗尽时运行,它会收集所有没有参考的对象。

即使调用System.gc()也不会导致垃圾收集器运行。该调用只是对垃圾收集器的提示,但是当垃圾收集器确定有足够的可用内存可用时,它将不会运行。

于 2013-07-11T10:25:16.690 回答
-1
  Assigning an Object to null is a code smell.

恕我直言

在将 Object/variable 设置为之后,null您可以调用System.gc()它强制垃圾收集器立即运行。

我相信不会有违规和代码味道。

于 2013-07-11T09:57:14.417 回答