私はJavaiterator
インターフェースについて調査していますが、なぜそのように設計されているのか理解できません。
java イテレータを使用hasNext
して、next
代わりにそれらを 1 つのメソッドにマージするのはなぜですか?
これはJavaイテレータの典型的な使用法です
Iterator iter = //iterator from a list
while(iter.hasNext()){
Object obj = iter.next();
// do something to obj
}
なぜだめですか
Iterator iter = //iterator from a list
Object obj = null;
try {
while(true){
obj = iter.next();
// do something to obj
}
} catch (NoSuchElementException e) {}
このアプローチが見栄えが悪いことは明らかですがnext
、最後に到達したときに null を返す代わりに例外をスローするとどうなるでしょうか? コードを単純化できるよりも
Iterator iter = //iterator from a list
Object obj = null;
while((obj = iter.next()) != null){
// do something to obj
}
これがObjective-CのNSEnumeratorの仕組みです
NSEnumerator *enumerator = // from an array
while (id obj = [enumerator nextObject]) {
// do something to obj
}
これにより、カスタム実装のオーバーヘッドが増加しますiterator
。
これにより、Java イテレータもスレッドセーフではなくなります。たとえば、ArrayList には 1 つの要素があります。2 つのスレッドが両方とも、そのリストの同じ反復子を同時に要求しますhasNext
。両方のスレッドが認識し、そのイテレータでtrue
呼び出します。next
要素が 1 つしかなく、反復子が 2 回要求されているため、間違いなく例外またはエラー状態になります。
スレッドセーフなイテレータがあることは知っていますが、それが実装されているかどうかはわかりませんが、多くのブロッキングが発生して非効率になっていると思います。
問題は、チェックと更新がアトミックに行われないことだと思います。なぜJavaiterator
がそのようなインターフェースを設計したのか理解できません。
アップデート
null が値になる可能性があるため、私のアプローチは無効です。しかし、上記の問題に対する回避策はありますか?