首页 > 解决方案 > 迭代复合材料

问题描述

Head First Design Patterns一书中,作者描述了使用迭代器遍历复合数据结构。它们提供了一些示例代码,在执行时会打印出存储在组合中的一系列菜单项。但是,如果您尝试多次调用迭代器,它将不再按预期工作并且不会产生任何结果。以下代码似乎导致了问题:

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

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

标签: javadesign-patternsiteratorcomposite

解决方案


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

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;
}

推荐阅读