いくつかの頻度では、ネットワーク接続によってバックアップされたIterator<Foo>
を提供するAPIを作成しています。実装はネットワーク接続を開き、ストリームから情報を読み取り、その情報を非直列化してFoo
に送り、呼び出し元に渡します。残念ながら、いつもIOException
の可能性があり、ネットワーク接続を正常に終了する必要があります(発信者が最後のFoo
を読み取ったときに自動的に行うことができますが、それが起こらない場合はどうなりますか?)。ネットワーク接続でバックアップされたJavaイテレータ
Iterator
の実装で投げ、そして受け入れられたアドバイスは「未チェックRuntimeException
秒でそれらをラップ」であることになるチェック例外に対処する方法についての質問のカップル(hereとhere)がすでにあります。一方、ネットワーク接続を閉じるために、Closeable
を実装することができます。だから私たちは行儀例外チェックの呼び出し元に対するこのようなもので終わる:
Iterator<Foo> iter = null;
try {
iter = getFooIterator();
while(iter.hasNext()) {
Foo foo = iter.next();
// do something with foo
}
}
catch(RuntimeException e) {
if(e.getCause() instanceof IOException) {
// do something with the IOException
}
else throw e;
}
finally {
if(iter instanceof Closeable) try { ((Closeable)iter).close(); } catch(IOException e) {}
}
そして、Iterator
を実装するために、このような素晴らしいアイデアのように思えました。より良い方法がありますか?
Java 7で作業している場合は、「AutoCloseable」を使用してtryステートメントのリソースを開くことも考えられます。 'try(iter = getFooIterator();){...}'(イテレータは 'AutoCloseable'を実装する必要があります)。 – Thomas
イテレータのメソッド( 'next()'や 'hasNext()'など)で接続を終了してから、例外をスローすることもできます。このようにして、イテレータのユーザはイテレータ(およびその基礎となる接続)を閉じることを心配する必要はなく、例外を処理するだけで済みます。 – Thomas
私は大きなIteratorの人ではないことを認めなければなりません(私はコレクションと単純な配列を1トン使用します)。なぜ簡単なAPIになるコレクションではなく、これらの自由な質問を持つIteratorを返すのですか?あなたはコレクションを取り戻し、すべてが閉じられ、何らかの例外が発生する可能性があります。私は答えを知っていると思うが、質問したいと思う。 – user949300