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();
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();
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,ImmutableList.copyOf
does good magic cuando se invoca con otra colección inmutable (los intentos de evitar copiar realmente los datos cuando es seguro hacerlo),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),copyOf(Collection)
ejemplo no crea temporal ArrayList
(copyOf(Iterable)
y copyOf(Iterator)
lo hace),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.
¡Gracias por la explicación detallada! – user973479
¿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). –
Tenía curiosidad antes de comenzar a usar guayaba en mi proyecto. No estaba seguro de cuál era la forma 'correcta' – user973479
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. –