Calling Iterator.hasNext()
is not supposed to have any side effects, and therefore should not change the state of the iterator.
Iterator.next()
advances the iterator by one item. So calling it inside Iterator.hasNext()
, breaks the
hasNext()
contract, and will lead to unexpected behavior in production.
public class FibonacciIterator implements Iterator<Integer>{ ... @Override public boolean hasNext() { if(next() != null) { return true; } return false; } ... }