Шаблон дизайна адаптера | адаптер, который преобразует Iterator в перечисление | ConcurrentModificationException - PullRequest
1 голос
/ 29 августа 2009

В рамках упражнения я реализую ArrayList, который будет поддерживать перечисления.

Ниже приведен адаптер, который преобразует Итератор в Перечисление:

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 ]

2 голосов
/ 29 августа 2009

MyArrayList имеет несколько проблем:

  1. создает Iterator в списке массивов нулевого размера; вы должны создавать новый итератор каждый раз, когда вызываете перечислитель
  2. реализует метод Enumerable непосредственно в MyArrayList
  3. он не использует дженерики должным образом

Этот класс должен решить следующие проблемы:

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

    public Enumeration<T> enumerator() {
        return new MyEnumeratorAdapter(this.iterator());
    }
}
1 голос
/ 29 августа 2009

В конечном итоге вы используете один и тот же Iterator несколько раз. Вам нужен новый каждый раз (создавая новый Enumeration каждый раз).

...