为什么Google Guava提供了存在等效构造函数的静态方法?

时间:2016-01-19 01:09:31

标签: java constructor guava

我注意到Google Guava Sets类提供newHashSetIterableIterator等方法。与Java捆绑在一起的HashSet类已经提供了一个带Collection的构造函数,从而提供了类似的行为。

所以我很好奇......这些特殊的静态方法在番石榴套装中有什么优势?是否只有IterableIterator个对象也是Collection?或者番石榴团队是否还有其他目的需要包括这些方法?

2 个答案:

答案 0 :(得分:5)

Iterable接口是在Java 1.5中引入的,是Collection接口的基本接口

HashSet构造函数早于此修改,我认为为了兼容性,他们已将其保留在Java 1.5中

另一方面,Guava不受此更改的限制,为方便起见,提供了Iterator的构造函数。

默认情况下,Iterable构造函数会尝试将Iterable投射到Collection,如果不可能,则会提取Iterator并调用{{1}构造函数。

在我看来,这为图书馆用户提供了更好的灵活性。

存在Iterator实用程序类的另一个原因是在调用泛型构造函数时,Java 1.5和1.6中需要进行长手写操作。

这个特殊问题在1.7中通过引入钻石算子解决了。

举例说明。

1.7之前

Sets

1.7之后

ArrayList<String> myList = ...
// See generic parameter repeated
HashSet<String> mySet = new HashSet<String>( myList );
// No such issue for statics
HashSet<String> myGuavaSet = Sets.newHashSet( myList );

答案 1 :(得分:4)

根据Google Guava文档,CollectionUtilitiesExplained

  

只要有可能,Guava更愿意提供接受Iterable而不是Collection的实用程序。在Google,遇到一个实际上并未存储在主内存中的“集合”并不是一般的,而是从数据库或其他数据中心收集,并且不能支持像{{1没有实际抓住所有元素。

     

因此,可以在size()中找到您希望看到的所有集合支持的许多操作。此外,大多数Iterables方法在Iterables中都有一个接受原始迭代器的相应版本。

     

Iterators类中的绝大多数操作都是懒惰的:它们只在绝对必要时才推进后备迭代。自己返回Iterables的方法返回延迟计算的视图,而不是在内存中显式构建集合。