我正在学习使用番石榴库,并提到了this,我看到了使用builder来构造不可变地图的实例。构建器构造函数如何创建抽象类实例?
static final ImmutableMap<String, Integer> WORD_TO_INT =
new ImmutableMap.Builder<String, Integer>()
.put("one", 1)
.put("two", 2)
.put("three", 3)
.build();
最佳答案
ImmutableMap (Guava: Google Core Libraries for Java 21.0-SNAPSHOT API)
指出它是“一个Map
,其内容将永不更改,许多其他重要属性在ImmutableCollection
处进行了详细说明”。
“在ImmutableCollection
处详述的其他重要属性”包括以下保证:
每个提供以下保证:
浅层不变性。绝对不能在此集合中添加,删除或替换元素。这比Collections.unmodifiableCollection(java.util.Collection<? extends T>)
的保证要强,Multiset.elementSet()
的内容在修改包装的集合时都会更改。
空敌意。该集合永远不会包含null元素。
确定性迭代。迭代顺序始终是明确定义的,具体取决于创建集合的方式(有关详细信息,请参见适当的工厂方法)。除非另有说明,否则诸如here之类的视图集合以与父级相同的顺序进行迭代。
线程安全。从多个线程同时访问此集合是安全的。
诚信此类型不能在此包的外部进行子类化(这将违反这些保证)。
最后的保证是完整性,这暗示着番石榴内部具有ImmutableMap
和其他不可变对象的具体实现(非抽象),而这些实际上是这些构建器返回的。
此外,源是开放的;您可以亲自了解构建器如何做到这一点(例如,您可以启动)。