Una respuesta que creo que es mejor que las ya presentadas es un método que convierte cualquier Iterable en una cíclica uno.
public class IterableUtils {
public static class CyclicIterator<T> implements Iterator<T> {
private final Iterable<T> inner;
private Iterator<T> currentIter;
public CyclicIterator(Iterable<T> inner) {
this.inner = inner;
}
public boolean hasNext() {
if (currentIter == null || !currentIter.hasNext()) {
currentIter = inner.iterator();
}
return currentIter.hasNext();
}
public T next() {
if (currentIter == null || !currentIter.hasNext()) {
currentIter = inner.iterator();
}
return currentIter.next();
}
public void remove() {
currentIter.remove();
}
}
public static <T> Iterable<T> cycle(final Iterable<T> i) {
return new Iterable<T>() {
public Iterator<T> iterator() { return new CyclicIterator<T>(i); }
};
}
}
A continuación, puede simplemente poner en práctica el método iterador solo en la clase Polygon y utilizar
for (Element e: polygon) {
...
}
para repetir una vez
para (elemento E: ciclo (polígono)) { . .. }
para iterar sin fin. Como beneficio adicional, el modificador de ciclo se puede aplicar a cualquier iterable.
Buen GHad, me alegro de haberlo preguntado. Esto mantiene la facilidad de uso de for-each y no rompe la encapsulación para evitar el problema. –
+1 Esto es esencialmente lo mismo que java.util.Map: puede llamar a entrySet(), keySet() o values (), que devuelven varios Iterables. – Avi