5

同じデータを繰り返し処理しようとしていますが、必要な場合にのみデータをロードしたいと考えています。また、取得したデータを複数の同時イテレータで再利用したいと考えています。

不足した場合により多くのデータをフェッチする機会があるが、複数のインスタンス間でフェッチされた同じデータを使用する基礎となるデータを作成できるオブジェクトまたはパターンはありますか? リストは同時に使用できる必要があります。私はたまたまJavaを使用しています。

現在、使用可能な値を返すイテレータを作成しました。バッファ内のデータが不足すると、返されるデータをさらに検索します。残念ながら、これは、オブジェクトのインスタンスが複数ある場合、インスタンスごとに 1 回ずつデータを処理することを意味します。

LinkedList を使用する場合、ConcurrentModificationError が心配です。

更新: 以下の回答では、これを実装するための有効な手段について説明していますが、一般的な概念によって引き起こされる多くの問題がありました (非標準、実装者を混乱させ、混乱に値しない利点)。私はこれが興味深く価値のある手段であると信じ続けていますが、問題が生じる可能性があります. いつものように、何かを「どのように」行うかを尋ねる前に、それを行うべきかどうかを尋ねる必要があります。

4

4 に答える 4

3

これが私がそれを行う方法です。

  • を実装するクラスを作成しますIterable
  • ArrayListクラスには、空のリストに初期化されるタイプのプライベート変数が必要です。
  • このクラスには、fillデータ ソースから 1 つまたは複数のエントリをフェッチし、プライベート リストの末尾に追加するメソッドが必要です。
  • クラスには、メソッドがそれ以上データを取得できないnoMore場合に設定されるフラグが必要です。fill
  • iterator()このクラスには、内部Iteratorクラス の新しいインスタンスを配信するメソッドが必要です。
    • 各反復子には、プライベート インデックス ... と親クラス リスト内の位置が必要です。
    • このhasNextメソッドは、親クラスのリスト size() に対してインデックスをテストします。それらが同じ場合は、 を呼び出しますfillnoMoreフラグが設定されている場合は、 を返しますfalse
    • 方法はnext...よくわかります。

これらすべてを適切に同期する必要があります...


ConcurrentModificationExceptionsこのアプローチは、プライベート リストを非表示にし、その上で を使用しないことで問題を回避しIteratorます。実際の反復子はget(int)、要素を取得するためにプライベート リストで使用します。

注: プライベート リストが公開され、他のコードが通常の方法でリストを更新または反復できるようになっている場合、このアプローチは予想通りには機能しません。

于 2013-05-27T13:24:29.477 に答える
0

オブジェクト プールを使用できますか? どのような種類のデータを使用して何をしようとしているのかはわかりませんが、いくつかの変更を加えることで、オブジェクト プールがニーズに合う可能性があると思います。

サンプル オブジェクト プールへのリンク http://sourcemaking.com/design_patterns/object_pool/java

于 2013-05-27T13:19:33.203 に答える
0

なぜ同期しないのですか??

 Collection c = Collections.synchronizedCollection(myCollection);

ユーザーは、返されたコレクションを反復処理するときに手動で同期することが不可欠です。

http://docs.oracle.com/javase/6/docs/api/java/util/Collections.html#synchronizedCollection(java.util.Collection)

于 2013-05-27T12:54:26.020 に答える