Синтаксис 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. Это предлагает беглый способ его использования и может рассматриваться как "синтаксический сахар".