Come dice Brian (e il tuo riferimento ai documenti), Iterable
s è molto più comune e a cosa sono abituati i programmatori. Quindi, usa Iterable
- permette anche di usare l'istruzione "foreach", che non supporta Enumeration
.
Dato che le collezioni non modificabili fanno parte del JDK di base, direi che i metodi di aggiunta / rimozione nella raccolta e i metodi di rimozione nell'iteratore sono esposti è proprio come è in Java.
È piuttosto comune semplicemente documentare l'API sufficientemente e lanciare UnsupportedOperationException
dove l'utente viola l'API.
Suggerirei l'implementazione di Tulains.
Tuttavia, lancia un UnsupportedOperationException
in remove
invece di non fare nulla. Ciò comunica correttamente l'interfaccia: si restituisce una raccolta non modificabile.
Questo è anche il comportamento delle classi JDK standard (ad esempio emptySet()
e unmodifiableList()
dalla classe Collections
).
Per completezza, l'implementazione (con un rappresentante sufficiente, avrei appena commentato la risposta di Tulains):
/* This is unmodifiable */
public class MyList<T> implements Iterable<T> {
@Override
public Iterator<T> iterator() {
return new Iterator<T>() {
@Override
public boolean hasNext() {
return false; // TODO: to implement
}
@Override
public T next() {
return null; // TODO: to implement
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
};
}
}
Nota che ho anche spostato Iterator
in una classe interna per separare la raccolta e il suo iteratore. Questo è anche il modo in cui è fatto, ad esempio, per la classe Collections.UnmodifiableList
.