我的(蒸馏)场景:
假设我有一个名为 的接口Interface
和一个class Foo implements Interface
.
我还有一个通用的可迭代“结果”类,除其他外,它委托给一个集合来做可迭代的事情。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
s 构造函数是public Result(Collection<? extends E> delegate)
(就像大多数Collection
s 一样),并让它以某种方式将该集合适应Collection<E>
,但我无法弄清楚它可能是什么样子。