为什么迭代器不强制执行hasnext调用?

时间:2013-08-15 22:09:55

标签: java iterator

如果hasNext和Next像这样工作,这似乎是一个很好的方法:

boolean hasNextCalled = false;

boolean hasNext() {
  hasNextCalled  = true
}

next() {
  assert hasNextCalled
}

这样我们就不会在我们得到NoSuchElementException()的情况下登陆。 hasNext()调用没有强制执行的任何实际原因?

6 个答案:

答案 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是一个接口,并且有很多实现。