Java 9中的Convenience Factory Method返回的特定集合类型

在Java 9中,我们有方便工厂方法来创建和实例化不可变的List,Set和Map。

但是,目前还不清楚返回对象的具体类型。

例如:

List list = List.of("item1", "item2", "item3"); 

在这种情况下,实际返回了哪种类型的列表? 它是ArrayList还是LinkedList或其他类型的List?

API文档刚提到这一行,没有明确提到它是一个LinkedList:

列表中元素的顺序与提供的参数的顺序或提供的数组中的元素的顺序相同。

List.of返回的类是包私有静态类之一,因此不属于公共API:

 package java.util; ... class ImmutableCollections { ... static final class List0 extends AbstractImmutableList { ... } static final class List1 extends AbstractImmutableList { ... } static final class List2 extends AbstractImmutableList { ... } static final class ListN extends AbstractImmutableList { ... } } 

所以这不是一个ArrayList(既不是LinkedList)。 您需要知道的唯一事情是它是不可变的并且满足List接口契约。

但是,目前还不清楚返回对象的具体类型。

这就是你需要知道的全部! 重点是:这些方法确实会返回一些List 。 您得到的东西保证满足List接口表示的公共合同。 它是给出该方法的东西的列表,其顺序与写下来的顺序相同。

你绝对应该避免编写任何需要了解这些方法返回的列表的代码! 这是一个实现细节,对于调用这些方法的客户端代码无关紧要!

从这个意义上讲:您的关注点应该更多地放在客户端 – 例如,避免使用您在示例中使用的原始类型(使用List而不使用特定的generics类型)。

虽然问题似乎已经由@ZhekaKozlov和@GhostCat回答,无论是返回类型( ImmutableCollections.List )以及它是如何创建包私有的,都不是公共API。 还要说明这些工厂方法的实现保证了履行List接口所表示的公共合同。


为了进一步提供ImmutableCollections的实现要点,然后在其中进一步设置,映射和列表。 我会为List添加一个示例表示,这与MapSet非常相似。


ImmutableCollections当前使用以下方法在接口List上实现这些工厂方法:

 abstract static class AbstractImmutableList 

它扩展了AbstractList类,并为覆盖其实现的所有可能操作抛出UnsupportedOperationException 。 意味着集合上不再允许操作,使它们等同于Java Immutable Collections 。

此外,这是一个类扩展

 static final class ListN extends AbstractImmutableList 

使用构造函数来评估输入的某些检查,其元素为NonNull,以返回由E[] elements (E类型的元素数组)组成的对象,并将某些实现重写为.get(int idx) .contains(Object o)基于这些要素。


Map和Set的方式类似,只是确保元素顶部的validation或一对键和值的validation。 这样你就无法创建它们(分别抛出IllegalArgumentException和NullPointerexception):

 Set set2 = Set.of("a", "b", "a"); Map map = Map.of("key1","value1","key1","value1"); Set set2 = Set.of("a", null); Map map = Map.of("key1",null); 

实际上,同样的想法是在Collectors.toList中 – 你得到一个List并且文档特别说明:返回的List There are no guarantees on the type, mutability, serializability, or thread-safety of the List returned目前它是一个返回的ArrayList ,但显然这可以在任何时间点改变。

我想知道是否应该在这里做同样的事情 – 明确提到类型是List而已。 这为将来的实现提供了很多基础,以决定最适合的类型 – 速度,空间等。

List.of返回一个特殊类型的List ,如Collections.UnmodifiableList 。 它既不是ArrayList也不是LinkedList 。 当您尝试修改它时会抛出exception。