ImmutableMap构建器如何创建抽象类的实例?

时间:2016-12-08 12:44:29

标签: java guava

我正在学习使用guava库并提到this我看到使用构建器来构造不可变映射的实例。构建器构造函数如何能够创建抽象类实例?

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

3 个答案:

答案 0 :(得分:2)

我没有, Builder 创建了一个 的实现ImmutableMap(一个extends ImmutableMap的类。

要清楚地理解,请在使用番石榴之前启动here

更新:请参阅@Louis Wasserman的评论。确实是一个重要的评论。

答案 1 :(得分:0)

构建器类的构造函数不是返回不可变映射的实例。

您首先通过调用new ImmutableMap.Builder<String, Integer>()创建构建器,然后在此ImmutableMap.Builder实例上调用链中的方法 - 是put方法的三倍,然后是{{1}方法。

build方法是最后一个方法,这就是创建并返回build实例的方法。

&#34;技巧&#34;这里ImmutableMap的{​​{1}}方法返回构建器本身(它最后有一个语句put),这样你就可以像这样链接方法调用。

事实上,ImmutableMap.Builder方法返回return this;子类的实例,因为类build是抽象的,因此无法直接实例化。

答案 2 :(得分:0)

ImmutableMap (Guava: Google Core Libraries for Java 21.0-SNAPSHOT API)声明它是&#34; Map,其内容永远不会改变,其他许多重要属性在ImmutableCollection&#34;详细说明。

ImmutableCollection&#34;详细介绍的其他重要资产。包括以下保证

  

每个人都做出以下保证:

     
      
  • 浅不变性。此集合中永远不能添加,删除或替换元素。这比Collections.unmodifiableCollection(java.util.Collection<? extends T>)的保证更强,其内容在修改包装集合时会发生变化。
  •   
  • Null-hostility。此集合永远不会包含null元素。
  •   
  • 确定性迭代。迭代顺序始终是明确定义的,具体取决于集合的创建方式(有关详细信息,请参阅相应的工厂方法)。查看集合(例如Multiset.elementSet())的迭代次数与父级相同,除非另有说明。
  •   
  • 线程安全。从多个线程同时访问此集合是安全的。
  •   
  • 完整性。此类型无法在此包之外进行子类化(这将允许违反这些保证)。
  •   

最后一个保证, integrety ,暗示了内部Guava具有ImmutableMap的具体实现(非抽象)以及其他不可变对象,这些对象实际上是由这些构建器返回的

此外,来源是开放的;你可以自己找出 构建器能够做到的事情(例如你可以开始here)。