2012-03-01 10 views
13

Zastanawiam się, który jest bardziej wydajny i dlaczego?Guava ImmutableList copyOf vs Builder

1)

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

lub

2)

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

Zidentyfikowałeś to jako wąskie gardło wydajności? Ponieważ, jeśli nie masz ** konkretnego ** powodu, dla którego dbasz o efektywność tego, powinieneś teraz zignorować ten aspekt i użyć bardziej czytelnego (tj. Pierwszego). –

+1

Byłem ciekawy, zanim zacząłem używać Guava w moim projekcie. Nie byłem pewien, która z nich była "poprawna". – user973479

+6

Jeśli istnieje prosta metoda pojedynczej metody, która wykonuje dokładnie to, czego oczekujesz, i sposób tworzenia obiektu i dwa sposoby wywołania (rodzaj) to samo, to za każdym razem wybrałbym prostszą. –

Odpowiedz

28

Nie widzę żadnego powodu, dlaczego należy użyć konstruktora tutaj:

  • ImmutableList.copyOf jest znacznie bardziej czytelny niż robienie Builder w tym przypadku
  • Builder nie wnioskować typu rodzajowego i trzeba określić typ przez się, gdy używany jako jeden-liner,
  • (od docs)ImmutableList.copyOfdoes good magic gdy wywołany z innej niezmiennej kolekcji (próbuje uniknąć faktycznie kopiowania danych, gdy jest to bezpieczne)
  • (od źródła)Builder#addAll wywołuje addAll na uprzednio utworzony ArrayList podczas copyOf unika tworzenia dowolnej listy o zerowym i jednoelementowych zbiorów (zwraca pustą listę niezmienny i singleton niezmienna listy odpowiednio)
  • (od źródła)copyOf(Collection) instancja nie tworzy tymczasowy ArrayList (copyOf(Iterable) i copyOf(Iterator) robi tak),
  • (od źródła) ponadto, Builder#build wywołuje copyOf na wcześniej zapełnionym wewnętrznie , co prowadzi do twojego pytania - dlaczego używać Builder tutaj, kiedy masz copyOf?

P.S. Osobiście używam statycznej fabryki ImmutableList.builder() zamiast konstruktora new ImmutableList.Builder<Blah>() - gdy przypisano ją do zmiennej Builder<Blah>, pierwszy rodzaj podstawowy generuje informacje, podczas gdy drugi nie.

+0

Dzięki za szczegółowe wyjaśnienie! – user973479