《Thinking in java》中一个范例的问题

来源:百度知道 编辑:UC知道 时间:2024/05/17 02:48:05
今天看到第8章,接口与内隐类。最后一个程序c08:controller:Controller.java(温室)它用到前面一个control framework,c08:controller:Controller.java:
class EventSet {
private Event[] events = new Event[100];
private int index = 0;
private int next = 0;
public void add(Event e) {
if(index >= events.length)
return; // (In real life, throw exception)
events[index++] = e;
}
public Event getNext() {
boolean looped = false;
int start = next;
do {
next = (next + 1) % events.length;
// See if it has looped to the beginning:
if(start == next) looped = true;
// If it loops past start, the list
// is empty:
if((next == (start + 1) % events.length)
&& looped)
return null;
} while(events[next] == null);
return events[next];
}
public void removeCurrent() {
events[next] = null;
}
}

书上原话是这样说的:当你寻找list中的下一个Event时,得使用next来检查是否已经饶行一周。这在调用gesNext()时尤其重要,因为当我们执行完Event对象之后便得运用removeCurrent()将这些Event对象移除,所以getNext()会在list的走访过程中遇上一些“空洞”。

我之前也琢磨了很久,后面才恍然大悟,我们都漏了一个细节:如果looped被赋值为true,那下一次遍历,他也不会被赋值为false了,所以if((next == (start + 1) % events.length)
&& looped)这个条件才有可能为true