Ответ 1
Я не вижу причин, по которым вы должны использовать строитель здесь:
-
ImmutableList.copyOf
гораздо читабельнее, чем созданиеBuilder
в этом случае -
Builder
не выводит общий тип, и вам нужно указать тип самостоятельно, когда используется как однострочный, - (from docs)
ImmutableList.copyOf
делает хорошую магию при вызове с другой неизменной коллекцией (попытки избежать фактического копирования данных, когда это безопасно) - (из исходного кода)
Builder#addAll
вызываетaddAll
ранее созданногоArrayList
, аcopyOf
избегает создания любого списка для коллекций с нулевым и одноэлементным доступом (возвращает пустой неизменный список и неизменный список singleton соответственно), - (из источника)
copyOf(Collection)
экземпляр не создает временныеArrayList
(copyOf(Iterable)
иcopyOf(Iterator)
делает это), - (из источника), кроме того,
Builder#build
вызываетcopyOf
на ранее внутренне заселенномArrayList
, что подводит вас к вашему вопросу - зачем использоватьBuilder
здесь, когда у вас естьcopyOf
?
P.S. Лично я использую ImmutableList.builder()
static factory вместо конструктора new ImmutableList.Builder<Blah>()
- при назначении переменной Builder<Blah>
первый вводит общий тип, а последний - нет.