迭代复合
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;
}
在 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;
}