在 C# 中,IEnumerator接口(interface)定义了一种遍历集合并查看元素的方法。我认为这非常有用,因为如果你通过 IEnumerable<T>
对于一个方法,它不会修改原始源代码。
但是,在 Java 中,Iterator定义 remove操作(可选!)允许删除元素。通过 Iterable<T>
没有任何优势方法,因为该方法仍然可以修改原始集合。
remove
的可选性 是 refused bequest 的一个例子气味,但忽略它(已经讨论过 here )我会对促使 remove
的设计决策感兴趣在接口(interface)上实现的事件。
导致 remove
的设计决策是什么?正在添加到 Iterator
?
换句话说,明确没有 remove
的 C# 设计决策是什么?定义于 IEnumerator
?
最佳答案
Iterator
能够在迭代期间移除元素。您不能使用迭代器迭代集合,也不能使用该集合的 remove()
方法从目标集合中删除元素。在下次调用 Iterator.next()
时,您将得到 ConcurrentModificationException
,因为迭代器无法知道集合究竟是如何更改的,也不知道如何继续迭代。
当您使用迭代器的 remove()
时,它知道集合是如何更改的。此外,实际上您不能删除集合中的任何元素,只能删除当前元素。这简化了迭代的继续。
关于传递迭代器或 Iterable 的优势:您始终可以使用 Collection.unmodifireableSet()
或 Collection.unmodifireableList()
来防止修改您的集合。
关于c# - 为什么 Iterator 定义 remove() 操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11648389/