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 ()?
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<>();
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.
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);
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();
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.
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());
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.