List.of() — 为啥要提供一个无法添加/删除/编辑的空元素列表? [复制]

Posted

技术标签:

【中文标题】List.of() — 为啥要提供一个无法添加/删除/编辑的空元素列表? [复制]【英文标题】:List.of() — Why offer an empty list of elements that can't be add/removed/edited? [duplicate]List.of() — 为什么要提供一个无法添加/删除/编辑的空元素列表? [复制] 【发布时间】:2019-03-05 11:13:18 【问题描述】:

我测试过的 Java 9 功能之一是 List.of(),用于创建不可修改的列表。我想知道 - 如果此方法返回一个无法添加/删除/编辑的空元素列表,该方法的目的是什么?

我唯一能想到的就是将此列表与另一个空列表进行比较,但是为什么不直接使用someList.isEmpty()

【问题讨论】:

零元素的列表没有什么特别或奇怪的,无论它们是否可修改。如果您要我家中的大象清单,我会给您List.of(),因为我的数量为零,而且我绝对不希望您将其添加到我的收藏中。 【参考方案1】:

首先,List.of() 不会创建任何新对象。它指的是一个静态的 final 常量,我们可以在 OpenJDK 源代码List.java 中看到。

static <E> List<E> of() 
    return ImmutableCollections.List0.instance();

...在source code 中为java.util.ImmutableCollections.List0.instance()

static <T> List0<T> instance() 
   return (List0<T>) INSTANCE;

List.of() 可以用来返回一个空列表而不是 null,这有很多优点:

消除NullPointerException 的风险 客户端代码不必检查null

【讨论】:

有关讨论,请参阅Is it better to return null or empty collection?。该页面适用于 C# 而不是 Java,但涉及相同的问题。【参考方案2】:

据我所知,这种方法的主要用途是用于调试。如果你想在某个列表上测试你的代码(比如对元素求和),有一个快速创建列表的方法很方便。由于内部实现,该列表不是可变的,但没关系,因为我们只是使用它来测试您的代码一次。

更新

由于 List.of(E e1, E e2, ...) 用于调试,没有理由不包含不带参数的 List.of(),因为在调试时通常会检查边缘情况和看看你的代码是否也适用于空列表。

【讨论】:

以上是关于List.of() — 为啥要提供一个无法添加/删除/编辑的空元素列表? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥我们不能在c中创建一个带有常量的数组[重复]

java为啥删除数组元素时只能删第一行,其它都显示找不到,但是打印的话全部都可以出来

为啥word空白页删不掉?

Mybatis-plus中BaseMapper和IService功能相似重复,为啥要提供两个接口?

为啥maya删后无法重装?

为啥我的U盘里面有一个audio_play_list.txt的文件删了又出来?删都删不了.