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.copyOf
does 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.
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). –
Byłem ciekawy, zanim zacząłem używać Guava w moim projekcie. Nie byłem pewien, która z nich była "poprawna". – user973479
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ą. –