私は、イテレータがIDisposableインターフェイスを実装するC#のバックグラウンドを持っています。自動的に閉じる同様のインターフェースを実装するJavaのイテレーターはありますか?
4 に答える
Java の Iterator は、オブジェクトのコレクションを繰り返し処理するための単なる抽象化です。基礎となるデータ構造が反復後に何らかのクリーンアップを必要とする場合 (ファイルを閉じるなど)、その基礎となるオブジェクトへの参照を保持して、それを「破棄」するために必要なことは何でもできるようにする必要があります。
Java 7では、AutoCloseableを実装する独自のイテレータ(またはそのデコレータ)を作成できます。次に、それをtryブロックで使用できます。
try ( Iterator<MyObject> it = new MyAutoCloseableIterator(list) ) {
while (it.hasNext()) {
MyObject obj = it.next();
}
}
tryブロックの最後で、IteratorがAutoCloseableインターフェースを実装している場合、「。close()」メソッドが自動的に呼び出されます。
http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
ただし、組み込みのイテレータ(通常はコレクションの内部クラスであるため、公開されていない)がこのインターフェイスを実装しているとは思いません。
もう1つのオプションは、(再び)独自のイテレータをコーディングし、「。hasNext()」メソッドがfalseを返したときにリソースを閉じることです。
これはIteratorによって提供される API です
メソッドの概要
boolean hasNext()
反復にさらに要素がある場合は true を返します。E next()
繰り返しの次の要素を返します。void remove()
基礎となるコレクションから、反復子によって返された最後の要素を削除します (オプションの操作)。
Enumeration
これは、Java コレクション フレームワークで置き換えることを意図しており、コレクションを反復処理するために使用されています。Iterator
デザインパターンに基づいています。
その目的はまさに提供されるものです。つまり反復。close
などとは何の関係もありません。スキャナ
など
のイテレータ インターフェイスを実装するクラスがこれを提供する場合、これはAPI の一部です。イテレータのアスペクト/インターフェースとは無関係close
Scanner
Java ではIterator
、インターフェイスそのものです。そして、それには方法がありませんclose()
。