私の(蒸留された)シナリオ:
Interface
、、およびと呼ばれるインターフェースがあるとしましょうclass Foo implements Interface
。
また、一般的な反復可能な「Result」クラスもあります。このクラスは、とりわけ、反復可能な処理を実行するためにコレクションに委任します。Resultクラスは、質問に関係のない他の処理を実行します。それで:
class Result<E> implements Iterable<E> {
private Collection<E> delegate;
public Result(Collection<E> delegate) {
this.delegate = delegate;
}
public Iterator<E> iterator() {
return delegate.iterator();
}
// ... other irrelevant stuff.
}
渡されるコレクションResult
は潜在的に膨大になる可能性がありますが、Result
オブジェクトのユーザーはいくつかの要素の後で反復を停止する可能性があります(ただし、いくつを制御することはできません)。
次に、別のクラスがあります。これをQueryと呼びます。これは、Foo
sのコレクションを内部的に保持しますが、Resultを返すことができる必要があります。現在、次のようになっています。
class Query {
private Collection<Foo> data;
public Result<Interface> getAllData() {
return new Result<Interface>(new ArrayList<Interface>(data));
}
// EDIT: Not all Result objects are of Interfaces.
public Result<SomeUnrelatedInterface> getSomeOtherData() {
return ...;
}
}
したがってgetAllData
、データのコピーを(として)取得し、委任のためArrayList<Interface>
に新しいデータに渡します。Result
そのコレクションはおそらく膨大であり、結果の受信者はおそらく最初のいくつかの結果のみを必要とするため、これは私にとって理想的ではありません。
今質問のために:
具体的なコレクションのコピーを取る必要がないように、誰かが物事を変える方法を考えることができますか?
理想的には、コンストラクターを(ほとんどResult
のコンストラクターと同じように)して、そのコレクションをに何らかの形で適合させたいのですが、それがどのように見えるかを理解できませんでした。public Result(Collection<? extends E> delegate)
Collection
Collection<E>