java - Guava ImmutableMap Builder 语法

标签 java guava immutability

我一直在使用 Guava 的 ImmutableMapBuilder有一段时间没有考虑它是如何/为什么工作的。我一直按照 Javadoc 描述的方式使用生成器:

ImmutableMap<String, Integer> WORD_TO_INT =
          new ImmutableMap.Builder<String, Integer>()
              .put("one", 1)
              .put("two", 2)
              .put("three", 3)
              .build();

我也看过例子 elsewhere关于此语法的 SO:

ImmutableMap<String,Integer> myMap = ImmutableMap.<String, Integer>builder()
    .put("one", 1) 
    .put("two", 2) 
    .put("three", 3) 
    .build();

两者似乎产生完全相同的结果。

快速浏览 ImmutableMap source显示静态 builder()在第二个示例中调用返回:new Builder<K, V>()

这两种方法之间似乎没有任何功能差异。

引擎盖下有什么区别吗?有什么理由偏爱其中之一吗?

编辑:添加字节码差异。

除了一行之外,生成的字节码几乎完全相同:

方法一(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]
     ........

方法二:( <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而第二个则没有。

最佳答案

不,它们是相同的。第一种语法的原因是它是一个很好的单行代码。

第二种语法的原因是您可能有循环或其他流程控制,您可能需要传递 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 在这种情况下可能会更好 - 但这只是一个例子。

关于java - Guava ImmutableMap Builder 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21921507/

相关文章:

java - Apache Commons CSV 库中封装的 token 和分隔符之间的字符无效

java - windows azure java客户端调用RESTFUL API

java - Guava 缓存/可配置驱逐/缓冲区替换策略

javascript - 无论是否可扩展,JavaScript 对象存储在哪里?

java - Java 中的函数式数据结构

java - 为什么集合会返回无序值,即使它在内部实现了 HashMap?

java - 在 BlueJ 中打印对象数组

java - 如何以线程安全的方式填充字符串映射和另一个映射?

Java - 如何比较 Guava 范围?

loops - Haskell - for 循环