2009-08-29 59 views
1

作为练习的一部分,我正在实现一个支持Enumerations的ArrayList。适配器设计模式|将Iterator转换为Enumeration的适配器| ConcurrentModificationException

下面是一个迭代器转换为枚举适配器:

public class MyEnumeratorAdapter<Object> implements Enumeration<Object> { 

    private Iterator<Object> adaptee; 

    public MyEnumeratorAdapter(Iterator<Object> it) { 
     this.adaptee = it; 
    } 

    @Override 
    public boolean hasMoreElements() { 
     return adaptee.hasNext(); 
    } 

    @Override 
    public Object nextElement() { 
     return adaptee.next(); 
    } 

} 

和我的ArrayList类是:

public class MyArrayList<Object> extends ArrayList<Object> { 

    public MyArrayList() { 
     this.enumerator = new MyEnumeratorAdapter<Object>(this.iterator()); 
    } 

    public Enumeration<Object> enumerator() { 
     return this.enumerator; 

    } 

    public boolean hasMoreElements() { 
     return this.enumerator.hasMoreElements(); 
    } 

    public Object nextElement() { 
     return this.enumerator.nextElement(); 
    } 

    private static final long serialVersionUID = 1L; 

    private Enumeration<Object> enumerator; 

} 
然而

,当我尝试这个测试用下面的代码,我m得到java.util.ConcurrentModificationException

public static void main(String[] args) { 
     MyArrayList<String> names = new MyArrayList<String>(); 
     names.add("jim"); 
     names.add("jack"); 
     names.add("jai"); 

     for (Enumeration<String> iterator = names.enumerator(); iterator 
       .hasMoreElements();) { 
      String name = (String) iterator.nextElement(); 
      System.out.println(name); 
     } 

    } 

我在做什么错误?

我可以有一个支持枚举的ArrayList类吗?

回答

2

MyArrayList有几个问题:

  1. 它创建了一个零大小的数组列表上的Iterator;你必须创建一个新的迭代器
  2. 它实现了直接在MyArrayList
  3. 它不使用泛型可枚举的方法调用枚举每次正常

这个类应该解决这些问题:

public class MyArrayList<T> extends ArrayList<T> { 

    public Enumeration<T> enumerator() { 
     return new MyEnumeratorAdapter(this.iterator()); 
    } 
} 
+0

修复1和3问题。谢谢。 如果myArrayList必须支持它,我应该在哪里放置Enumeration的方法? MyEnumeratorAdapter中的 – HanuAthena 2009-08-29 16:26:07

+0

? – dfa 2009-08-29 17:34:47

1

您最终反复使用相同的Iterator。您每次都需要一个新的(每次创建一个新的Enumeration)。