web-dev-qa-db-fra.com

Lists.newArrayList vs new ArrayList

Quelle est la meilleure construction pour créer un List de chaînes? Est-ce que Lists.newArrayList() (de goyave) ou new ArrayList()?

est-ce juste une préférence personnelle?
ou s'agit-il simplement d'une inférence de type générique?
ou existe-t-il une quelconque valeur théorique ou pratique à utiliser Lists.newArrayList ()?

68
asela38

Le générateur de goyave enregistre en tapant les arguments de type plusieurs fois. Comparer:

List<Foo<Bar, Baz>> list = Lists.newArrayList();
List<Foo<Bar, Baz>> list = new ArrayList<Foo<Bar, Baz>>();

Dans Java 7, il est un peu obsolète, car vous avez l'opérateur Diamond:

List<Foo<Bar, Baz>> list = new ArrayList<>();
87
Bozho

De source de Guava :

public static <E> ArrayList<E> newArrayList() {
    return new ArrayList<E>();
}

Tout ce que vous faites est de permettre l'inférence de type - pas de différence lors de l'exécution.

29
Paul Bellora

Ajoutez un point, surcharge la version de Lists.newArrayList () est plus utile:

  • Lists.newArrayList(E... elements)
  • Lists.newArrayList(Iterable<? extends E> elements)
  • Lists.newArrayList(Iterator<? extends E> elements)

fournit des fonctions plus utiles que new ArrayList().

Par exemple: new ArrayList() ne peut pas faire:

Lists.newArrayList("a","b");
Lists.newArrayList(anIterable);
13

C'est ce que fait Lists.newArrayList:

@GwtCompatible(serializable = true)
public static <E> ArrayList<E> newArrayList() {
    return new ArrayList<E>();
}

Donc, les deux sont fondamentalement les mêmes, avec newArrayList ayant l'avantage de ne pas avoir à dupliquer le type générique. Ceci est très utile sur les génériques complexes:

List<Map<X,List<Y>> list = new ArrayList<Map<X,List<Y>>();

List<Map<X,List<Y>> list = Lists.newArrayList();
4
phlogratos

Comme expliqué ici , les principales motivations pour utiliser Lists, Sets etc. sont d'améliorer la lisibilité/la duplication dans votre code, ainsi que pour l'inférence de type.

3
darrengorman

Approche Java 8 pour les constructeurs surchargés.

Si vous souhaitez utiliser les constructeurs surchargés de Guava, je vous recommanderais une autre méthode en utilisant Java 8 Builder Builder.

List<String> listTest = Stream.<String>builder.add("Hello").add("My Name").add("Blah").build().collect(Collectors.toList());
2
Rituraj

Comme indiqué, Java 7 rend cette méthode obsolète, mais j'utilise la méthode factory car elle facilite la modification du type d'une liste, d'un ensemble, d'une carte ou de tout autre élément ultérieurement.

1
daveb