问题:请直接看下面第一段代码的注释处
下面两段代码主要是说明通过内部类来实现,多重继承的功能,通过内部类来继承Event类,然后外部类继承Controller类,将继承了Event的内部类对象放到eventList中,来调用。

package controller;
import java.util.*;public class Controller { private List<Event> eventList = new ArrayList<Event>();
public void addEvent(Event c){ eventList.add(c); }
public void run(){
while(eventList.size() > 0){
//for(Event e : eventList){   //如果是直接用,则会出错。
for(Event e : new ArrayList<Event>(eventList)){  //为什么这里要再新建一个new ArrayList<Event>(eventList)?
if(e.ready()){
System.out.println(e);
e.action();
eventList.remove(e);
}
}
}
}
}package controller;public abstract class Event { private long eventTime;
protected final long delayTime;
public Event(long delayTime){
this.delayTime = delayTime;
}
public void start(){
eventTime = System.nanoTime() + delayTime;
}
public boolean ready(){
return System.nanoTime() >= eventTime;
}
public abstract void action();
}

解决方案 »

  1.   

    是不是考虑了多个线程同步问题?如果直接用for(Event e : eventList),那另外一个线程再加一个event进来怎么办?
      

  2.   

    那外面再套一个ArrayList有什么区别吗? 
      

  3.   

    //for(Event e : eventList){   //如果是直接用,则会出错。
    for(Event e : new ArrayList<Event>(eventList)){ 
     //为什么这里要再新建一个new ArrayList<Event>(eventList)?为什么会出现这样的错误呢,其实原因是楼主没有理解透for循环中创建的均为临时变量,
    如:这里在for 循环中Event e,其实是创建的临时对象,它的生命周期只是在这个for循环之内,
    当for循环结束时,就会自动销毁了,所以需要建立一个new ArrayList<Event>(eventList)临时对象来实现循环,
    不然就会出现上述情况。楼主现在理解了吧
    (我郁闷啊,刚才已经打好了,提交出现错误,又重新敲了一遍)
      

  4.   

    ArrayList的问题,迭代的时候不允许修改.
    结贴.