用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子类并将其返回。

10-08 01:47