我正在学习使用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();
答案 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)。