以下代码的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();
}
}
答案 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只是强调空分配通常是一种气味,而不是任何问题的事实。