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

Cur*_*der 4 java collections factory literals java-9

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

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

例如:

List list = List.of("item1", "item2", "item3");
Run Code Online (Sandbox Code Playgroud)

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

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

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

Zhe*_*lov 9

返回的类List.of是一个包私有静态类,因此不是公共API的一部分:

package java.util;
...

class ImmutableCollections {
    ...

    // Java 9-10
    static final class List0<E> extends AbstractImmutableList<E> {
        ...
    }

    static final class List1<E> extends AbstractImmutableList<E> {
        ...
    }

    static final class List2<E> extends AbstractImmutableList<E> {
        ...
    }

    static final class ListN<E> extends AbstractImmutableList<E> {
        ...
    }


    // Java 11+
    static final class List12<E> extends AbstractImmutableList<E> {
        ...
    }

    static final class ListN<E> extends AbstractImmutableList<E> {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 是的,**不可变**部分是相关的,因为否则客户可能确实有兴趣了解空间与操作时间(如随机插入和附加等)的实现特性.由于其不可变,因此无关紧要. (2认同)

Gho*_*ica 9

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

这就是所有你需要知道的!整点是:这些方法做一些回报List<Whatever>目的.您得到的东西保证满足List接口表示的公共合同.它是给出该方法的东西的列表,其顺序与写下来的顺序相同.

你绝对应该避免编写任何需要了解的代码了解这些方法返回的名单!这是一个实现细节应该没有关系到客户端代码调用这些方法!

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