【发布时间】:2014-07-28 14:56:49
【问题描述】:
一个实现Iterable接口的对象必须有一个带有这个签名的方法:
Iterator<T> iterator()
作为Iterable,这段代码安全吗?
while(o.iterator().hasNext()) { ... }
换句话说,iterator() 是否可以返回 null 以防没有可迭代的内容?
编辑:
1- 正如你们中的一些人所指出的,每次执行 o.iterator() 时返回的迭代器都是不同的。很公平!我必须承认我在写问题时忘记了这一点。
假设这一行被重写:
Iterator<String> it = o.iterator();
....
....
while(it.hasNext() {...}
2- 正如你们中的一些人所指出的,当 Iterable.iterator() 的文档说:“返回一组 T 类型元素的迭代器”时,返回 null 是一种不好的编程习惯。
但是,我的问题是 Java API 文档中的某些“合同”是否直接或间接地阻止了返回 null。对我来说,“在一组 T 类型的元素上返回一个迭代器”并不能阻止返回 null。我可能错了。
您的回答和其他研究得出的结论
总体而言:Java API 无法说明迭代器值是否为 null,除非在文档中明确说明。在这种情况下,没有说明任何内容,但是可以认为 Java API 方法永远不会返回 null 迭代器值。对于个人编写的 API,这可能会有所不同。
- 文档中没有任何内容阻止返回值为 null(例如 @NotNull)
- 在 Javadoc 中,许多 @Return 是显式的,而 null 也是预期的
- This question 是关于一般的空返回值,很有趣。
- 我发现 an attempt 是一种描述 API 的语言,尽管它适用于 .NET
【问题讨论】:
-
你为什么在循环中调用
o.iterator()?只需获取一次,只需先致电hasNext()。 -
Not according to the docs。 (显然,这并不能阻止某人编写确实返回
null的实现,但这会违反接口。) -
文档说:在一组 T 类型的元素上返回一个迭代器。没有关于 null 的排除。
-
@mins
null不是一组元素的迭代器。 -
nullincluded 也没有。 JDK Javadoc 中到处都是@return 标记,这些标记指定可以返回null。如果在这种情况下不存在,那么您无论如何都无权承担它。