java - 为什么迭代器不强制 hasext 调用?

标签 java iterator

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

boolean hasNextCalled = false;

boolean hasNext() {
  hasNextCalled  = true
}

next() {
  assert hasNextCalled
}

这样我们就永远不会遇到 NoSuchElementException() 的情况。 不强制执行 hasNext() 调用有什么实际原因吗?

最佳答案

有什么好处?您只需将 NoSuchElementException 替换为 AssertionError,并引入一点点开销。另外,由于 Iterator 是一个接口(interface),因此您无法实现一次;它必须出现在Iterator的每个实现中。另外,文档没有强制要求在调用 next 之前调用 hasNext,因此您的提案将违反当前契约(Contract)。这样的更改会破坏任何依赖 NoSuchElementException 编写的代码。最后,可以在生产代码中关闭断言,因此您仍然需要 NoSuchElementException 机制。

关于java - 为什么迭代器不强制 hasext 调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18262733/

相关文章:

java - 如何在 Liferay 中以编程方式运行 "clean up permissions"

java - 当我们删除元素时,ArrayList 的容量会减少吗?

java - 如何将 javascript 生成的报告导出为 pdf?

c++ - 为什么在 std::vector 删除中需要 begin()?

c++ - 如果从不调用任何非常量方法,丢弃 const 是否安全

c++ - 如何固定输出 C++、STL 中文本的位置

c++ - 将迭代器存储在临时容器中,然后将它们从其他容器中移除

Java 十进制转二进制 - 大数转二进制

java - Eclipse 调试时跳行

python - 为什么一个类需要 __iter__() 来返回一个迭代器?