我正在学习使用番石榴库,并提到了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和其他不可变对象的具体实现(非抽象),而这些实际上是这些构建器返回的。

此外,源是开放的;您可以亲自了解构建器如何做到这一点(例如,您可以启动)。

10-04 14:55