【发布时间】:2010-02-01 11:13:01
【问题描述】:
我有一个java.util.Iterator 的实现,它要求对next() 的调用应始终由对hasNext() 的调用进行。 (这是因为结果在多线程环境中是异步返回的,并且永远不清楚可能还有多少结果。
在 JavaDoc 中正确记录这一点是否“正确”,然后在违反时抛出 RuntimeException。或者这是否将 Iterator 接口拉伸得太远了?
感谢所有想法?
【问题讨论】:
-
经过反思和所有出色的答案,我得出的结论是问题出在迭代器接口上。应该只有一个方法 next() 到达结束时返回 null(或毒丸)。你同意吗?
-
我不同意。首先,null 可以是 Iterable 的有效元素。其次,考虑到泛型类型擦除,你将如何确保你的毒丸属于 T 类型,但不知何故不是有效的返回值? (如果 next() 不返回 T 类型的实例,我会立即驳回任何论点)。
-
@ILMTitan 我同意你的观点,但不要认为 Poison Pill 类型的特殊对象即使不是 T 类型也会造成任何伤害。替代方案(有两种方法)要糟糕得多.
-
Poison Pill 类型的特殊对象会造成的危害是强制 next() 的返回类型从 T 变为 Object。反过来,这将导致对 next 的每次调用都必须调用 instanceOf 后跟强制转换。在任何中等规模的项目中,这都是大量的样板代码(与泛型最初应该摆脱的样板代码完全相同。我不明白你对这两种方法解决方案的问题,这很容易理解边界检查的方法,当你做一些愚蠢的事情时抛出异常。
-
那么按照毒丸类型,你是在说空对象模式吗?
标签: java concurrency iterator