微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

迭代复合

如何解决迭代复合

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

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

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

解决方法

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。