【问题标题】:How to fix pmd violation "NullAssignment"?如何修复 pmd 违规“NullAssignment”?
【发布时间】:2020-06-30 00:49:04
【问题描述】:

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

【问题讨论】:

    标签: java refactoring pmd


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      这段代码写在错误的相信设置为null的引用被垃圾回收更快。

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

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

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

      【讨论】:

        【解决方案3】:
          Assigning an Object to null is a code smell.
        

        恕我直言

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多