番石榴不可变地图生成器语法
2022-09-02 04:24:49
我已经使用番石榴一段时间了,没有考虑它是如何工作的/为什么。我一直在以Javadoc描述的方式使用构建器:ImmutableMap
Builder
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
builder()
new Builder<K, V>()
这两种方法之间似乎没有任何功能差异。
引擎盖下有什么区别吗?有什么理由偏爱其中之一?
编辑:添加字节码差异。
生成的字节码几乎完全相同,只有一行:
方法 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