2012-02-22 10 views

答えて

2

Javaにはyield return文はありません。あなたが望むことを行うための最善の方法は、Iteratorという独自の実装を書くことです。

class LazyIterator implements Iterator<Foo> { 
    private Iterator<Foo> backingIterator = null; //set this later 

    private void lazyLoad() { 
     if (backingIterator != null) { 
      return; 
     } 
     //load the backing collection and assign to backingIterator here 
    } 

    @Override 
    public boolean hasNext() { 
     lazyLoad(); 
     return backingIterator.hasNext(); 
    } 

    @Override 
    public Foo next() { 
     lazyLoad(); 
     return backingIterator.next(); 
    } 

    @Override 
    public void remove() { 
     lazyLoad(); 
     backingIterator.remove(); 
    } 
} 

ご覧のとおり、これはオール・オア・ナッシング・ローズ・ローダーです。また、コレクションの進行中にのみデータをロードするインクリメンタル遅延ローダーも考えてください。これが便利なケースは、コレクションに非常に多数のレコードが含まれている場合です。

もっと具体的にする必要があります。CollectionまたはListの遅延読み込みラッパーを作成することもできます。このテクニックは似ていますが、一般的にはより多くの作業が必要になります(レイジーロードされたListはレイジーなIteratorが必要かもしれませんが、スレッドの安全性に関心を持つ必要があります)。

これは、基本的には、コンパイル時の変換で、C#のyieldとyieldの戻り値のキーワードを手作業で行います。

関連する問題