在实现Iterable接口时,iterator()方法是否应该返回集合的克隆?

时间:2015-09-12 22:40:13

标签: java iterator

我见过很多关于如何实现Iterable接口的例子,其中iterator()方法只返回要迭代的原始集合。但这似乎违背了迭代器的部分目的,因为人们应该能够遍历所述集合,而不必担心收集在你下面的变化。难道Iterable的iterator()方法总是不能返回集合的克隆吗?并且,最好是深度克隆?

我知道,这个问题的答案可能部分基于意见,这是一种禁止的意见。但是,我想要的是Iterable接口的原始意图,而不是人们可能会或可能不会决定使用它。

1 个答案:

答案 0 :(得分:5)

  

但这似乎违背了迭代器的部分目的,因为它应该能够遍历所述集合,而不必担心收集在你下面的变化。

这不是迭代器为您提供的保证之一。事实上,有一个特殊的异常ConcurrentModificationException是为了提醒程序员在他正在迭代的集合被修改的情况下创建的。

  

Iterable的iterator()方法不应该总是返回集合的克隆吗?并且,最好是深度克隆?

绝对可以。然而,这将是非常昂贵的,特别是对于如此基本的操作。想一想:每次你想在一个集合上运行for-each循环时,库就会“哦,等一下,我必须在让你迭代之前克隆这整个1000元素的东西”。这将是非常缓慢的,并且当他们认为性能很关键时(这包括很多情况下性能实际上并不重要的情况)时,提示程序员停止使用迭代器。

最重要的是,即使您实施Cloneable(因为Cloneable is broken),Java也不知道如何克隆您的元素。

当然,您总是可以选择自己克隆集合,并迭代它以更好地隔离并发运行的进程。但是,在这种情况下,程序员需要做出支付这种隔离的决定,这与为他做出这个决定的图书馆不同。