用Java返回集合的最佳方法是什么?
我应该允许调用者提供要添加的集合吗?还是只返回项目的List<>
或Set<>
?或两者?
public class Item { ... }
public class SomeOtherClass
{
private List<Item> myItems;
public List<Item> getItems()
{
return Collections.unmodifiableList(this.myItems);
}
public void collectItems(Collection<? super Item> target)
{
target.addAll(myItems);
}
}
注意:上面的示例假定存在可以立即返回的列表。如果这样的列表以前不存在,并且在调用方调用getItems()或collectItems()时必须生成,则我也对适当的答案感兴趣。
(我已根据Mykola提出的观点重命名了collectItems。)
最佳答案
我只喜欢List<Item> getItems()
方法。仅执行void getItems(Collection<? super Item> target)
性能或其他操作,myCollection.addAll(foo.getItems())
与调用方相比并没有真正的优势。 Collections.unmodifiableXYZ
仅创建包装器,而不创建集合的完整副本,因此,如果立即使用包装器并将其丢弃,它将永远不会脱离第一代包装,并且将以极少的开销快速收集。
如果不总是能够实现项目集合,则可以在不知道有多少项目时考虑让getItems返回Iterable<Item>
。如果您知道项目的数量并且可以为它们编写一个迭代器,那么很容易编写一个自定义的AbstractCollection
子类并将其返回。