如果hasNext和Next像这样工作,这似乎是一个很好的方法:
boolean hasNextCalled = false;
boolean hasNext() {
hasNextCalled = true
}
next() {
assert hasNextCalled
}
这样我们就不会在我们得到NoSuchElementException()的情况下登陆。 hasNext()调用没有强制执行的任何实际原因?
答案 0 :(得分:9)
有什么好处?您只需将NoSuchElementException
替换为AssertionError
,再加上一点点开销。此外,由于Iterator
是一个接口,因此您无法实现此次;它必须在Iterator
的每个实现中进行。此外,文档并未强制要求在致电hasNext
之前致电next
,因此您的提案将违反当前合同。这样的更改会破坏任何依赖NoSuchElementException
编写的代码。最后,可以在生产代码中关闭断言,因此您仍然需要NoSuchElementException
机制。
答案 1 :(得分:2)
NoSuchElementException
是一个运行时异常,反映了程序员错误......与您的方法完全一样。调用hasNext()
并非强制要求,因为可能您不需要 - 例如,您事先知道集合的大小,并知道您可以拨打多少次next()
。
关键是你正在交换报告程序员错误的一种方式......另一种报告程序员错误的方法可以禁用一些有用的方法。
答案 2 :(得分:1)
也许我们已经知道还剩下一些元素。例如,也许我们在锁步中迭代两个大小相同的列表,我们只需要在一个迭代器上调用hasNext
来检查两者。另外,assert
调用hasNext
实际上并不会阻止任何人在没有next
的情况下调用hasNext
,尤其是在断言关闭的情况下。
答案 3 :(得分:1)
您可能知道有一个next()
,例如,如果您始终有一对元素,则只需拨打hasNext()
两次即可拨打next()
。
答案 4 :(得分:0)
我的2美分。 API在此处对客户端使用情况进行假设并强制执行此操作。让我们说我总是确定我只返回1个结果然后通过hasNext()
调用并通过调用next()
直接检索元素
答案 5 :(得分:0)
首先,你建议的断言只会在断言被启用时运行。
但主要问题是你只考虑一个用例。该库旨在以最小的限制支持程序员的工作,每个类和方法必须适合一个连贯和连贯的整体。
其他海报也提供了很好的理由(因为我正在打字),特别是Iterator是一个接口,并且有很多实现。