2009-08-29 47 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)。