【发布时间】:2014-03-22 04:54:54
【问题描述】:
我已经使用 Guava 的 ImmutableMap 和 Builder 有一段时间了,而没有过多考虑它的工作原理/原因。我一直在按照Javadoc 描述的方式使用构建器:
ImmutableMap<String, Integer> WORD_TO_INT =
new ImmutableMap.Builder<String, Integer>()
.put("one", 1)
.put("two", 2)
.put("three", 3)
.build();
我还看到了关于这种语法的示例 elsewhere:
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 而第二行没有。
【问题讨论】:
标签: java guava immutability