迭代复合

Iterating over a composite

Head First Design Patterns book, the authors describe using an iterator to traverse over composite data structures. They provide some sample code 中,执​​行时会打印出存储在组合中的一系列菜单项。但是,如果您多次尝试调用迭代器,它将不再按预期工作并且不会产生任何结果。以下代码似乎是导致问题的原因:

public Iterator<MenuComponent> createIterator() {
    if (iterator == null) {
        iterator = new CompositeIterator(menuComponents.iterator());
    }
    return iterator;
}

本质上,他们正在创建一个无法为将来的迭代重置的单例迭代器。不幸的是,简单地将此逻辑替换为 return CompositeIterator 的新实例也会破坏算法。 issue 是几年前在 GitHub 上提出的,但尚未解决。有人对如何解决这个问题有什么建议吗?

正如链接问题在评论中所说:

return iterator; // the `iterator' never resets to null once it's set.

我们需要重置 iterator 我们已经完成了它,但是当迭代器仍然有剩余元素时不需要,因为 CompositeIterator 取决于它。

一种方法是添加另一个重置 iterator 的条件 - 当迭代器没有更多元素时:

public Iterator<MenuComponent> createIterator() {
    if (iterator == null || !iterator.hasNext()) {
        iterator = new CompositeIterator(menuComponents.iterator());
    }
    return iterator;
}