2012-03-01 15 views
13

Me preguntaba ¿cuál es más eficiente y por qué?Guava ImmutableList copyOf vs Builder

1)

List<Blah> foo; 
... 
return ImmutableList.copyOf(foo); 

o

2)

List<Blah> foo; 
... 
return new ImmutableList.Builder<Blah>().addAll(foo).build(); 
+8

¿Ha identificado esto como su cuello de botella de rendimiento? Porque a menos que tenga una razón ** específica ** por la que le importa la eficiencia de esto, debe ignorar ese aspecto por ahora y usar el más legible (es decir, el primero). –

+1

Tenía curiosidad antes de comenzar a usar guayaba en mi proyecto. No estaba seguro de cuál era la forma 'correcta' – user973479

+6

Si hay una forma de llamada de método único simple que hace exactamente lo que quiere y una construcción-de-objetos-y-dos-métodos-llamadas-manera de hacer (tipo de) lo mismo, entonces elegiría el más simple cada vez. –

Respuesta

28

No veo ninguna razón por la que debe utilizar el constructor aquí:

  • ImmutableList.copyOf es mucho más legible que hacer un Builder, en este caso,
  • Builder no infiere tipo genérico y tiene que especificar el tipo de a sí mismo cuando se utiliza como una sola línea,
  • (de documentos)ImmutableList.copyOfdoes good magic cuando se invoca con otra colección inmutable (los intentos de evitar copiar realmente los datos cuando es seguro hacerlo),
  • (de origen)Builder#addAll invoca addAll creado previamente en ArrayList mientras copyOf evita la creación de cualquier lista para-cero y un elemento de colecciones (devuelve lista inmutable vacía y Singleton lista inmutable, respectivamente),
  • (de origen)copyOf(Collection) ejemplo no crea temporal ArrayList (copyOf(Iterable) y copyOf(Iterator) lo hace),
  • (de la fuente) además, Builder#build invoca copyOf en previamente internamente poblado ArrayList, ¿qué te trae a tu pregunta? ¿por qué usar Builder aquí, cuando tienes copyOf?

P.S. Personalmente utilizo la fábrica estática ImmutableList.builder() en lugar del constructor new ImmutableList.Builder<Blah>() - cuando se asigna a una variable Builder<Blah>, la primera infiere el tipo genérico mientras que la segunda no.

+0

¡Gracias por la explicación detallada! – user973479