Adattatore Design Pattern | Adattatore che converte un iteratore ad un'enumerazione | ConcurrentModificationException

StackOverflow https://stackoverflow.com/questions/1351763

  •  20-09-2019
  •  | 
  •  

Domanda

Come parte di un esercizio, sono l'attuazione di un ArrayList che sosterrà le enumerazioni.

In seguito è l'adattatore che converte un iteratore ad un Enumeration:

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();
    }

}

e la mia classe 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;

}

Tuttavia, quando provo questo test con il seguente codice, sto diventando 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);
        }

    }

quello che errore sto facendo?

Posso avere una classe ArrayList che supportano enumerazioni?

È stato utile?

Soluzione

MyArrayList ha diversi problemi:

  1. crea un Iterator su una lista di array di dimensioni pari a zero; è necessario creare un iteratore fresca ogni volta che si chiama enumeratore
  2. implementa il metodo di Enumerable direttamente in MyArrayList
  3. non fa uso di farmaci generici correttamente

Questa classe dovrebbe risolvere questi problemi:

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

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

Altri suggerimenti

si finisce per utilizzare più volte lo stesso Iterator. Avete bisogno di uno nuovo ogni volta (con la creazione di un nuovo Enumeration ogni volta).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top