【发布时间】:2014-04-28 00:44:56
【问题描述】:
我调用下面的方法,每次“finishedRacers”都有相同的对象。我尝试放置一个 .clear(),并使用 new 为其分配新内存,但每次我重新输入该方法时,它都会返回相同的对象。即使在我尝试重新分配并清除它之后,为什么finishedRacers 仍然持有对象有什么想法吗?
@Override
public Queue<Racer> stopThenResetEvent(){
Queue<Racer> q = new LinkedList<Racer>();
while(!finishedRacers.isEmpty()) q.add(finishedRacers.poll());
return q;
}
不确定这是否重要,但该类涉及继承,并且在 this 扩展的抽象类中声明了 finishedRacers 队列。抽象类继承自接口。
编辑:
finishedRacers 的声明方式与 q 相同,它是一个使用 LinkedList 实现的队列。队列在此类扩展的抽象类中声明。它去 IEvent (Interface) --> Event (Abstract, 其中队列被声明) --> GroupEvent (这个被覆盖的方法被调用的类)。我调用此方法的目的是清除 finishedRacers 队列并返回其中保存的对象。
当我多次调用此方法时,不更改事件状态(添加新赛车手、开始比赛等),但再次调用此方法时,它将不断返回相同的赛车手队列。但我的期望是,一旦调用它,除非将更多的赛车手添加到 finishedRacers 队列中,否则它应该是一个空队列。
【问题讨论】:
-
finishedRacers到底是什么类型?能否请您发布一个更完整的示例,以便我们重现该问题。 -
这段代码与提到的问题无关,麻烦换个地方试试。在涉及finishedRecords 的地方添加更多代码。
-
您可以考虑将
Queue#poll()更改为remove(),这样如果队列为空,您将得到一个异常(而不是空值)。您可能还需要synchronize (finishedRacers);是什么让您认为这是您的错误所在? -
这个方法的目的是什么?它在语义上与
return finishedRacers;相同,或者使用finishedRacers或其访问器方法而不是根本调用此方法。 -
aleks:此代码使用的唯一上下文是当我直接调用它以将完成的Racers 添加到另一个类中的队列并打印出结果时。我调试了代码,并且在单步执行时唯一的异常是队列将对象保留在其中,但是 poll() 我认为应该删除它们,我还尝试了 clear() 并分配了一个新队列,但队列总是有再次完成赛车手。在我多次调用此函数之间没有运行任何代码行
标签: java memory-management methods queue