我正在研究 javaiterator
接口,但不明白为什么它是这样设计的。
为什么java迭代器使用hasNext
并将next
它们合并为一种方法?
这是java迭代器的典型用法
Iterator iter = //iterator from a list
while(iter.hasNext()){
Object obj = iter.next();
// do something to obj
}
为什么不
Iterator iter = //iterator from a list
Object obj = null;
try {
while(true){
obj = iter.next();
// do something to obj
}
} catch (NoSuchElementException e) {}
很明显,这种方法看起来很难看,但是如果next
在到达结束时返回 null 而不是抛出异常会发生什么?比代码可以简化为
Iterator iter = //iterator from a list
Object obj = null;
while((obj = iter.next()) != null){
// do something to obj
}
这就是 Objective-C 中 NSEnumerator 的工作方式
NSEnumerator *enumerator = // from an array
while (id obj = [enumerator nextObject]) {
// do something to obj
}
这增加了实现 custom 的开销iterator
。
这也使 java 迭代器不是线程安全的。例如,一个 ArrayList 中有一个元素。两个线程都同时为该列表请求相同的迭代器hasNext
。两个线程都将看到并且它们将在该迭代器上true
调用。next
因为只有一个元素并且迭代器被询问了两次,这肯定会导致异常或错误状态。
我知道有线程安全的迭代器,但我不确定它是否能实现,但我认为很多阻塞正在发生,这使得它效率低下。
我认为问题是检查和更新不是自动发生的,我不明白为什么 java 设计iterator
了这样的界面。
更新
我看到 null 可以是一个值,所以我的方法是无效的。但是我上面提到的问题有什么可能的解决方法吗?