2009-08-29 6 views
1

練習の一環として、列挙をサポートするArrayListを実装しています。続きアダプタデザインパターン|イテレータをEnumerationに変換するアダプタ| ConcurrentModificationException

は列挙にIteratorを変換アダプタです:

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; 

} 

、私は次のコードで、このテストをしようとすると、私は」取得する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を作成します。

    public class MyArrayList<T> extends ArrayList<T> { 
    
        public Enumeration<T> enumerator() { 
         return new MyEnumeratorAdapter(this.iterator()); 
        } 
    } 
    
    :あなたは、新鮮なイテレータを作成する必要がありますあなたが列挙
  2. を呼び出すたびに、それが適切に

このクラスは、これらの問題を修正する必要があり、それがジェネリックを使用していないMyArrayList

  • に直接列挙のメソッドを実装します
  • +0

    1と3の問題が修正されました。ありがとうございました。 myArrayListがサポートする必要がある場合は、どこでEnumerationのメソッドを配置しますか? MyEnumeratorAdapterの – HanuAthena

    +0

    ? – dfa

    1

    同じIteratorを繰り返し使用すると終了します。毎回新しいものが必要です(毎回新しいEnumerationを作成してください)。

    関連する問題