Мне было интересно, что более эффективно и почему?
1)
List<Blah> foo;
...
return ImmutableList.copyOf(foo);
или
2)
List<Blah> foo;
...
return new ImmutableList.Builder<Blah>().addAll(foo).build();
Мне было интересно, что более эффективно и почему?
1)
List<Blah> foo;
...
return ImmutableList.copyOf(foo);
или
2)
List<Blah> foo;
...
return new ImmutableList.Builder<Blah>().addAll(foo).build();
Я не вижу причин, по которым вы должны использовать строитель здесь:
ImmutableList.copyOf гораздо читабельнее, чем создание Builder в этом случаеBuilder не выводит общий тип, и вам нужно указать тип
самостоятельно, когда используется как однострочный,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> первый вводит общий тип, а последний - нет.
Строитель позволяет добавлять вещи. Т.е. если вам нужно добавить другой объект, это может быть проще сделать с помощью шаблона Builder:
ImmutableList<SomeModel> newModelObjects = new ImmutableList.Builder<SomeModel>()
.addAll(getModelObjects()).add(newModelObject).build();
В отличие от:
ArrayList<SomeModel> list = new ArrayList<>(getModelObjects());
list.add(newModelObject);
ImmutableList<SomeModel> newModelObjects = ImmutableList.copyOf(list);