Lists.newArrayList vs新的ArrayList
创build一个stringList
的最佳构造是什么? 它是Lists.newArrayList()
(从番石榴)或new ArrayList()
?
这只是个人喜好吗?
还是只是键入genericstypes推断?
或者在使用Lists.newArrayList()有没有任何理论或实际价值?
番石榴生成器保存inputtypes参数多次。 比较:
List<Foo<Bar, Baz>> list = Lists.newArrayList(); List<Foo<Bar, Baz>> list = new ArrayList<Foo<Bar, Baz>>();
在Java 7中,它已经过时了,因为你有钻石操作符:
List<Foo<Bar, Baz>> list = new ArrayList<>();
从番石榴的来源 :
public static <E> ArrayList<E> newArrayList() { return new ArrayList<E>(); }
所有这一切都允许types推断 – 在运行时没有区别。
加一点, 重载版本的Lists.newArrayList()更有用:
-
Lists.newArrayList(E... elements)
-
Lists.newArrayList(Iterable<? extends E> elements)
-
Lists.newArrayList(Iterator<? extends E> elements)
提供比new ArrayList()
更有用的function。
例如: new ArrayList()
不能这样做:
Lists.newArrayList("a","b"); Lists.newArrayList(anIterable);
这就是Lists.newArrayList所做的事情:
@GwtCompatible(serializable = true) public static <E> ArrayList<E> newArrayList() { return new ArrayList<E>(); }
所以这两个基本上是一样的,使用newArrayList的优点是不必复制genericstypes。 这对复杂的generics非常有用:
List<Map<X,List<Y>> list = new ArrayList<Map<X,List<Y>>(); List<Map<X,List<Y>> list = Lists.newArrayList();
正如这里所解释的那样,使用Lists
, Sets
等的主要动机是提高代码中的可读性/重复性以及types推断。
如前所述,Java 7使得这个过时了,但是我使用了工厂方法,因为它可以在以后更改列表,集合,映射或其他types。
用于重载构造函数的Java 8方法。
如果您想使用Guava的重载构造函数,我会推荐使用Java 8 Stream Builder的另一种方法。
List<String> listTest = Stream.<String>builder.add("Hello").add("My Name").add("Blah").build().collect(Collectors.toList());