Синтаксис Guava ImmutableMap Builder
я использовал Guava ImmutableMap
С Builder
на какое-то время, не задумываясь о том, как/почему это работает. Я использую builder так, как описано в Javadoc:
ImmutableMap<String, Integer> WORD_TO_INT =
new ImmutableMap.Builder<String, Integer>()
.put("one", 1)
.put("two", 2)
.put("three", 3)
.build();
я также видел примеры везде на так этого синтаксиса:
ImmutableMap<String,Integer> myMap = ImmutableMap.<String, Integer>builder()
.put("one", 1)
.put("two", 2)
.put("three", 3)
.build();
оба производят тот же результат.
быстрый взгляд на ImmutableMap
источник показывает, что static builder()
звонок в 2-й пример возвращает: new Builder<K, V>()
нет никаких функциональных различий между этими двумя методами.
есть ли разница под капотом? Есть причины предпочесть то или другое?
EDIT: добавление разницы байт-кода.
сгенерированный байт-код практически идентичен, за исключением одной строки:
Способ 1(Builder<K,V>
):
static {};
0 new com.google.common.collect.ImmutableMap$Builder [12]
3 dup
4 invokespecial com.google.common.collect.ImmutableMap$Builder() [14]
7 ldc <String "key1"> [17]
........
Способ 2:(<K,V>builder()
)
static {};
0 invokestatic com.google.common.collect.ImmutableMap.builder() : com.google.common.collect.ImmutableMap$Builder [12]
3 ldc <String "key1"> [18]
........
после этого они в значительной степени то же самое, первая строка отличается имеет смысл, учитывая исходные различия, но я не уверен, почему первый вызывает dup
а второй-нет.
2 ответов
нет, они идентичны. Причина первого синтаксиса заключается в том, что он делает хороший однострочный.
причиной второго синтаксиса является то, что у вас может быть цикл или другое управление потоком, вам может потребоваться передать Builder
вокруг.
например:
public static void main(final String[] args) throws Exception {
final ImmutableList.Builder<Integer> lb = ImmutableList.builder();
for (final String arg : args) {
lb.add(Integer.parseInt(arg));
}
}
и прежде чем вы это скажете, да FluentIterable
вероятно, было бы лучше в этом случае - но это всего лишь пример.
Как говорится в javadoc, сгенерированный построитель эквивалентен построителю, созданному ImmutableMap.Конструктор-конструктор.
рекомендуется писать такой метод при применении шаблона Builder. Это предлагает беглый способ его использования и может рассматриваться как "синтаксический сахар".