我正在研究Java的iterator
接口,但不明白为什么它被设计成这样。
为什么Java Iterator要使用hasNext
和next
方法而不是将它们合并成一个方法?
以下是Java Iterator的典型用法。
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
}
这会增加实现自定义iterator
的开销。
这也使得Java迭代器不是线程安全的。例如,一个ArrayList里有一个元素。两个线程同时请求该列表的相同迭代器的hasNext
方法。然后,两个线程都将看到true
并调用该迭代器的next
方法。因为只有一个元素,并且迭代器被请求了两次,这肯定会导致异常或错误状态。
我知道有线程安全的迭代器,但我不确定如何实现,我认为会发生很多阻塞,从而使其效率低下。
我认为问题在于检查和更新没有原子地发生,我无法理解为什么Java设计了这样的iterator
接口。
更新
我看到null可以是一个值,所以我的方法是无效的。但是否有可能绕过我上面提到的问题?
hasNext()
е’Ңnext()
дјҡеёҰжқҘжҖ§иғҪжҲҗжң¬пјҹ - Andrew Spencer