Java 番石榴不可变列表副本vs生成器

Java 番石榴不可变列表副本vs生成器,java,guava,Java,Guava,我想知道哪个更有效,为什么 (一) 列出foo; ... 返回ImmutableList.copyOf(foo); 或 (二) 列出foo; ... 返回新的ImmutableList.Builder().addAll(foo.build(); 我看不出您在此处使用builder的任何理由: ImmutableList.copyOf比创建一个Builder更具可读性 Builder不推断泛型类型,您必须通过 你自己当一个班轮 (来自文档)ImmutableList.copyOf当与另一个不可

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

(一)

列出foo;
...
返回ImmutableList.copyOf(foo);

(二)

列出foo;
...
返回新的ImmutableList.Builder().addAll(foo.build();

我看不出您在此处使用builder的任何理由:

  • ImmutableList.copyOf
    比创建一个
    Builder
    更具可读性
  • Builder
    不推断泛型类型,您必须通过 你自己当一个班轮
  • (来自文档)
    ImmutableList.copyOf
    当与另一个不可变集合一起调用时(在安全的情况下尝试避免实际复制数据)
  • (源代码)
    Builder#addAll
    调用先前创建的
    ArrayList
    上的
    addAll
    ,而
    copyOf
    避免为零元素和一元素集合创建任何列表(分别返回空的不可变列表和单元素不可变列表)
  • (来自源代码)
    copyOf(集合)
    实例不创建临时
    ArrayList
    copyOf(Iterable)
    copyOf(迭代器)
    这样做)
  • (源代码)此外,
    Builder#build
    在以前内部填充的
    ArrayList
    上调用
    copyOf
    ,您的问题是什么?当您有
    copyOf
    时,为什么在这里使用
    Builder

另外,我个人使用
ImmutableList.builder()
静态工厂,而不是
新的ImmutableList.builder()
构造函数-当分配给
builder
变量时,第一个变量推断泛型类型,而后者不推断泛型类型。

builder允许您添加内容。也就是说,如果需要添加另一个对象,那么使用生成器模式可能更容易:

ImmutableList<SomeModel> newModelObjects = new ImmutableList.Builder<SomeModel>()
    .addAll(getModelObjects()).add(newModelObject).build();
ImmutableList newModelObjects=newImmutableList.Builder()
.addAll(getModelObjects()).add(newModelObject.build();
与之相反:

ArrayList<SomeModel> list = new ArrayList<>(getModelObjects());
list.add(newModelObject);
ImmutableList<SomeModel> newModelObjects = ImmutableList.copyOf(list);
ArrayList list=newArrayList(getModelObjects());
添加(newModelObject);
ImmutableList newModelObjects=ImmutableList.copyOf(列表);

您是否已确定这是您的性能瓶颈?因为除非你有一个特别的原因来关心这方面的效率,否则你现在应该忽略这一方面,而使用可读性更强的一个(即第一个)。在我开始在我的项目中使用番石榴之前,我只是好奇。我不确定哪种方法是“正确的”,如果有一种简单的单一方法调用方法可以完全满足您的需要,并且一个对象构造和两个方法调用可以(某种程度上)完成相同的事情,那么每次我都会选择一种更简单的方法。@user973479如果您想到的首要问题是哪种方法更有效,这是错误的。如果由于某种反常的自然现象,单个方法调用的效率较低,那么不管怎样,这只是一个最终会有人修复的bug。想要了解什么更有效以及库是如何工作的并不是误导。只有当你因为性能原因而喜欢阅读较难的内容,而没有充分的理由关心上下文中的性能时,这才是错误的。问题是“什么更有效,为什么不”我应该使用哪个。谢谢你的详细解释!
ImmutableList<SomeModel> newModelObjects = new ImmutableList.Builder<SomeModel>()
    .addAll(getModelObjects()).add(newModelObject).build();
ArrayList<SomeModel> list = new ArrayList<>(getModelObjects());
list.add(newModelObject);
ImmutableList<SomeModel> newModelObjects = ImmutableList.copyOf(list);