如何修复pmd违规“NullAssignment”?

时间:2013-07-11 09:50:46

标签: java refactoring pmd

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

将Object指定为null是代码气味。考虑重构。

以下代码不是由我编写的,我也有一个关于为什么要创建临时计时器实例的问题,然后将此实例分配给计时器? startTimerstopTimer将用于多线程上下文。

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();
  }
}

3 个答案:

答案 0 :(得分:1)

这段代码写在false中,认为设置为null的引用被垃圾收集得更快。

因此来自PMD的消息是这个错误信念被编码。

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

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

答案 1 :(得分:0)

  Assigning an Object to null is a code smell.

IMHO

将对象/变量设置为null后,您可以调用System.gc()来强制垃圾收集器立即运行。

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

答案 2 :(得分:0)

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

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

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

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