我调用下面的方法,每次'finishedRacers'都有相同的对象。我尝试使用.clear(),并使用 new 为它分配新内存,但每次重新输入方法时,它都会返回相同的对象。关于为什么在我尝试重新分配并清除它之后,为什么finishedRacers仍然持有对象的想法?
@Override
public Queue<Racer> stopThenResetEvent(){
Queue<Racer> q = new LinkedList<Racer>();
while(!finishedRacers.isEmpty()) q.add(finishedRacers.poll());
return q;
}
不确定它是否重要,但该类包含继承,并且在扩展的抽象类中声明finishedRacers队列。抽象类继承自接口。
编辑:
finishedRacers的声明方式与q相同,它是一个使用LinkedList实现的Queue。队列在此类扩展的抽象类中声明。它是IEvent(接口) - &gt;事件(摘要,声明队列) - &gt; GroupEvent(调用此重写方法的类)。我将此方法称为清除finishedRacers队列并返回其中保存的对象。
当我多次调用它时,不改变事件的状态(添加新的赛车手,开始比赛等),但只是再次调用此方法,它将不断返回同一个赛车队列。但我的期望是,一旦被调用,除非将更多的赛车手添加到finishedRacers队列中,否则它应该是一个空队列。
答案 0 :(得分:0)
很难在如此小的代码中找到错误。
使用 finishedRacers 的下一个代码段。使用您在代码中使用的方法扩展下面的列表,并使用 BugFinderList
实现 finishedRacers它可以帮助您找到错误。
public class BugFinderList extends LinkedList {
@Override
public synchronized boolean add(Object o) {
boolean result = super.add(o);
System.out.println("[Add] List size is ["+size()+"]");
return result;
}
@Override
public synchronized void clear() {
super.clear();
System.out.println("[Clear] List size is ["+size()+"]");
}
@Override
public synchronized Object poll() {
Object result = super.poll();
System.out.println("[Poll] List size is ["+size()+"]");
return result;
}
}
答案 1 :(得分:0)
问题在于打印出赛车手的代码。这是问题代码:
q = currentEvent.getCurrentFinished();
if(q.isEmpty()) q.addAll(finishedRacers.get(run));
我不知道在做研究之前,在返回时调用addAll方法也会将它添加到引用的队列中,我认为更改将是本地的。使用此代码修复它:
Queue<Racer> q1 = currentEvent.getCurrentFinished();
if(q1.isEmpty()) q.addAll(finishedRacers.get(run));
else q.addAll(q1);
这样我就不会在返回的队列上调用addAll。