Guava ImmutableSet:Builder与of有何区别?

10

com.google.common.collect.ImmutableSetJavadoc提供了两种创建ImmutableSet<E>实例的方式,这些实例由类型为E的元素(例如E e1E e2)创建,而这些元素尚未在集合中存在(即忽略使用copyOf方法从现有集合中创建的方式):

  1. "of"方法:

    ImmutableSet<E> set = ImmutableSet.of(e1, e2);
    
  2. 建造者

    ImmutableSet<E> set = new ImmutableSet.Builder<E>().add(e1).add(e2).build();
    

这两种方法最终都使用ImmutableSet.Builder#construct,但是我应该选择哪一种方法呢?


1
作为第三个选项,您还可以使用 ImmutableSet.<E>builder() 来代替直接调用构造函数。个人而言,我会使用 of(e1, e2) 的形式,因为它更加简洁明了。 - Andy Turner
3
如果没有必要,千万不要使用Builder。它的代码会更长、难以理解,并且会产生无用的垃圾变量。虽然也不算太糟糕,但也没有什么优势。当然,如果你确实需要使用构造器,那就去用吧。 - maaartinus
1
请参见此问题、评论和我的答案 - Grzegorz Rożniecki
1个回答

16

这完全取决于你如何构建ImmutableSet。如果你所有的元素都在一个地方可用,那么直接使用of(E...)方法。这肯定会更短。

但是,如果你从不同的地方获取元素,那就意味着,你的对象状态没有在一个地方完成,而是在流程中累积数据。那么你就必须采用Builder方式。创建一个Builder,随时添加元素。然后当你完成时,只需调用build()获取ImmutableSet


顺便提一下,如果你查看Guava的源代码,你会注意到Builder.build()调用了copyOf,而copyOf又调用了of()方法来处理最简单的情况(0个或1个元素),因此这两种构造方式是等效的,最终得到的集合也是相同的。 - Giovanni Botta
@GiovanniBotta 是的,最终结果是相同的,正如楼主已经提到的那样。只是达到目标的方式不同 :) - Rohit Jain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接