2012-04-02 12 views
56

¿Cuál es la mejor construcción para crear un List de Strings? ¿Es Lists.newArrayList() (de guayaba) o new ArrayList()?Lists.newArrayList vs new ArrayList

¿es solo una preferencia personal?
o solo es Tipo de inferencia de tipo genérico?
o hay algún valor teórico o práctico al usar Lists.newArrayList()?

+5

Debe leer [el apartado de constructores estáticos] (http://code.google.com/p/guava-libraries/wiki/CollectionUtilitiesExplained) – assylias

Respuesta

79

El constructor de guava guarda escribiendo los argumentos de tipo varias veces. Compare:

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

En Java 7 que es un poco obsoleta sin embargo, porque usted tiene el operador de diamantes:

List<Foo<Bar, Baz>> list = new ArrayList<>(); 
+28

No es bastante obsoleta, debido a las sobrecargas - ' Liza.newArrayList (1, 2, 3) 'le permite inicializar con elementos, y' Lists.newArrayListWithExpectedSize (20) 'hace que el significado de' 20' sea más obvio que 'new ArrayList <> (20)'. La "respuesta oficial" a esta pregunta, por cierto, es [aquí] (http://code.google.com/p/guava-libraries/wiki/CollectionUtilitiesExplained#Static_constructors). –

+10

Sí, pero es otro método. Quise decir que el no-arg es obsoleto. – Bozho

+4

Por lo que vale, también libera al sitio de llamadas de tener que importar 'ArrayList'. –

24

De Guava's source:

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

Todo lo que está haciendo es lo que permite la inferencia de tipos - No hay diferencia en el tiempo de ejecución.

3

Como se explicó here, las principales motivaciones para usar Lists, Sets etc. son mejorar la legibilidad/duplicación en su código, y para la inferencia de tipo.

1

Como se mencionó, Java 7 lo hace obsoleto, pero utilizo el método de fábrica porque hace que cambiar el tipo de lista, conjunto, mapa o lo que sea sea más fácil más adelante.

4

Esto es lo que hace Lists.newArrayList:

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

Así que estos dos son básicamente los mismos, con el uso de newArrayList que tiene la ventaja de no tener que duplicar el tipo genérico. Esto es muy útil en los genéricos complejos:

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

List<Map<X,List<Y>> list = Lists.newArrayList(); 
+0

La llamada al método completo con Guava según la firma del método sería 'Listas. >> newArrayList()'. Usted puede dejar de lado el tipo de genéricos. Pero también puede hacer esto con el Constructor: 'List >> list = new ArrayList();' funciona también. –

12

Añadir un punto, sobrecarga versión de Lists.newArrayList() es más útil:

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

proporciona funciones más útiles que new ArrayList().

Por ejemplo: new ArrayList() no puede hacer:

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

Java 8 aproximación para constructores sobrecargados.

Si desea utilizar los constructores sobrecargados de Guava, recomendaría otra forma de utilizar Java 8 Stream Builder.

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