有没有理由避免Java中的哨兵模式?

Jim*_*ing 5 java design-patterns

我听说过人们应该总是使用Iterator模式来控制循环,而不是抛出异常(这是在Python迭代器中完成的方式)或使用Sentinel模式,从而返回一个特殊的,哨兵值(通常null)表示迭代的结束.

最佳做法是否建议不要使用哨兵模式?如果是这样,为什么?(除了它不使用foreachJava 1.5中的语法).

编辑:代码示例1 - Sentinel模式

Reader r = ...;
for( int val = r.read(); val != -1; val = r.read()) {
   doSomethingWith(val);
}
Run Code Online (Sandbox Code Playgroud)

代码示例2 - 迭代器模式

for(Iterator<Thing> it = getAnIterator() ; it.hasNext(); ) {
  Thing t = it.next();
  doSomethingWith(t);
}
Run Code Online (Sandbox Code Playgroud)

Pau*_*ier 15

Sentinel模式的问题在于它明确地从作为有效元素的值集中排除了sentinel值.即,如果您有一个可以有效地包含null作为元素的对象列表,则使用null作为标记值是失败的.


Asa*_*aph 9

例外情况只应用于"例外"情况.结束或打破循环是正常的程序流程,而不是特殊情况.

此外,在使用Java(或任何语言)工作时,您希望使用社区中常见且众所周知的模式和约定,因为其他Java程序员可能需要维护您的代码.如果他们这样做,他们很可能会期望看到迭代器,而不是哨兵模式.

  • 我同意这个原则并建议遵循它.肮脏的秘密是异常抛出版本非常快,特别是如果您使用了缓存的异常单例.但我不会这样做,除非我需要疯狂的速度,我可以证明它更快.我在这里提到它只是因为它很有趣. (4认同)