一尘不染

Collections.emptyList()而不是null检查?

java

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

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()中进行上述检查确实非常丑陋……我想知道是否有更好的方法甚至是其他方法处理这个。


阅读 307

收藏
2020-12-03

共1个答案

一尘不染

为了节省不必要的对象创建

这是一个非常糟糕的主意,它将使== null检查和其他处理极端情况的代码变得乱七八糟(无论如何最终都会导致空指针异常)!

现在我想知道是否无法使用Collections.emptyList()

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

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

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

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

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

2020-12-03