如何解决迭代复合
在 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 举报,一经查实,本站将立刻删除。