Adattatore Design Pattern | Adattatore che converte un iteratore ad un'enumerazione | ConcurrentModificationException
-
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?
Soluzione
MyArrayList
ha diversi problemi:
- crea un
Iterator
su una lista di array di dimensioni pari a zero; è necessario creare un iteratore fresca ogni volta che si chiama enumeratore - implementa il metodo di Enumerable direttamente in
MyArrayList
- 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