Guava ImmutableList copyOf vs Builder

时间:2012-03-01 13:38:42

标签: java guava

我想知道哪个更有效率,为什么?

1)

List<Blah> foo;
...
return ImmutableList.copyOf(foo);

2)

List<Blah> foo;
...
return new ImmutableList.Builder<Blah>().addAll(foo).build();

2 个答案:

答案 0 :(得分:29)

我认为你没有理由在这里使用构建器:

  • ImmutableList.copyOf比在这种情况下制作Builder更具可读性
  • Builder不会推断泛型类型,您必须指定type by 当你用作单线时,你自己
  • 当使用另一个不可变集合调用时,
  • (来自文档) ImmutableList.copyOf does good magic尝试避免在安全的情况下实际复制数据),
  • (来自源代码) Builder#addAll在先前创建的addAll上调用ArrayList,而copyOf则避免为零元素和单元素创建任何列表collections(分别返回空的不可变列表和单例不可变列表),
  • (来自源代码) copyOf(Collection)实例不会创建临时ArrayListcopyOf(Iterable)copyOf(Iterator)会这样做),
  • (来自源代码)此外,Builder#build会在以前内部填充的copyOf上调用ArrayList,这会引出您的问题 - 为何使用{{1}在这里,当你有Builder

P.S。我个人使用copyOf静态工厂而不是ImmutableList.builder()构造函数 - 当分配给new ImmutableList.Builder<Blah>()变量时,第一个推断泛型类型,而后者则不是。

答案 1 :(得分:0)

Builder允许您添加内容。即如果您需要添加另一个对象,则可以使用Builder模式进行操作:

c1&c2&c3&c4&c5&c6=0

相对于:

ImmutableList<SomeModel> newModelObjects = new ImmutableList.Builder<SomeModel>()
    .addAll(getModelObjects()).add(newModelObject).build();