Dan*_*Dan 8 java concurrency iterator
我有一个实现java.util.Iterator要求next()始终通过调用来进行调用hasNext().(这是因为结果在多线程环境中异步返回,并且永远不清楚可能会有多少结果).
在JavaDoc中正确记录它是否"正确"然后抛出一个RuntimeException如果违反了它.或者这会使Iterator接口拉得太远?
所有的想法赞赏?
Fab*_*eeg 18
我可能在这里遗漏了一些东西,但为什么不在hasNext()实施中调用内部?
uck*_*man 15
要求hasNext()在被叫之前next()违反iterator合同.你真的应该重写它,这样如果没有要返回的元素,就会next()抛出一个NoSuchElementException.
我想你做的是这样的:
class IteratorImpl<T> implements Iterator<T> {
private Source<T> source = ...
private T next = null;
public boolean hasNext() {
if(next == null) {
next = source.poll();
}
return next != null;
}
Run Code Online (Sandbox Code Playgroud)
这对我来说听起来不错.我无法想象你想要next没有使用的情况hasNext- 这将是异常的一个秘诀.
编辑:
该文档的hasNext()说:
如果迭代具有更多元素,则返回true.(换句话说,如果next会返回一个元素而不是抛出异常,则返回true.)
对我来说,实施不违反合同.但是,我(正如Fabian Steeg暗示的那样)仍然执行next():
public T next() {
if(!hasNext()) {
throw new NoSuchElementException();
}
T ret = next;
next = null;
return ret;
}
Run Code Online (Sandbox Code Playgroud)
我的意思是,这项检查真的让你付出了什么代价?
您必须NoSuchElementException根据API合同检查并抛出一个.我相信,无论是测试!hasNext()还是next == null将满足这个标准,我都赞成前者.
如果有人抓住NoSuchElementException而不是打电话hasNext(),你可能会遇到更大的问题.