java - Collections.emptyList() 而不是空检查?

标签 java collections null empty-list

如果我在某个类中有一个很少使用的集合,它可能会被多次实例化,我有时可能会求助于以下“惯用语”以节省不必要的对象创建:

List<Object> list = null;

void add(Object object) {
    if (list == null)
        list = new ArrayList<Object>();

    list.add(object);
}

// somewhere else
if (list != null)
    for (Object object : list)
         ;

现在我想知道我是否不能使用 Collections.emptyList() 消除那些空检查,但是我将不得不更改 add() 中的 if 检查> 像这样:

if (list == Collections.<Object>emptyList())
    list = new ArrayList<Object>();

除了每次都分配一个新的空集合之外,还有更好的方法来处理这个问题吗?

编辑:为了清楚起见,我使用 Collections.emptyList(),但是上面的 add() 检查真的很难看...我想知道是否有更好的方法来做到这一点,或者甚至有其他的方法来处理这个问题。

最佳答案

in order to save unnecessary object creations

这真是个糟糕的主意,它会让你的代码乱七八糟 == null检查和其他极端情况的处理(并且大概最终会出现空指针异常)!

Now I was wondering if I couldn't eliminate those null checks using Collections.emptyList()

不,不是真的。 emptyList()返回一个空列表。你可以

if (list.equals(Collections.<Object>emptyList()))

但如果 list == null 仍然会抛出 NullPointerException , 所以这仍然不是您想要的。

我的建议:始终将列表初始化为 new ArrayList<Object> , 或者,如果你想从一个方法返回一个空列表,使用 Collections.emptyList()反而。 (这每次都会返回相同的实例,因此也不会创建不必要的对象。)

然后使用.isEmpty()检查集合是否为空。

关于java - Collections.emptyList() 而不是空检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6546875/

相关文章:

java - 如何检查是否可以从 String 创建 BigInteger

java - 加载目录中的所有 dozer xml 文件

java - 如何比较两个具有相同大小的集合中存在的值

r - 为什么空数据框无法通过 is.null() 测试?

java - 是否有 Java 8 .or() 返回当前值或提供的默认值的可选?

java - 如何从文件中提取扩展名为 .csv 的文件名

java - Mockito:如何 stub getter setter

scala - 避免 Scala 中的循环

Javascript:如何测试一个对象是一个对象(而不是数组或字符串)?

android - 为什么 getAllNetworks() 在禁用 wifi 或数据移动时返回 0?