Ответ, который я думаю, лучше, чем уже представленный, - это метод, который превращает любой Iterable в циклический.
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); }
};
}
}
Тогда вы можете просто реализовать один метод итератора в классе Polygon и использовать
for (Element e: polygon) {
...
}
для итерации один раз и
для (Элемент e: цикл (многоугольник)) {...}
для итерации бесконечно.В качестве бонуса модификатор цикла может быть применен к любой итерации.