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

2022-09-01 20:04:11

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

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)
         ;

现在我想知道我是否无法使用消除那些空检查,但是然后我必须像这样更改if签入:Collections.emptyList()add()

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

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

编辑:为了清楚起见,我想使用Collections.emptyList(),但是上面的check in add()真的非常丑陋...我想知道是否有更好的方法来做到这一点,甚至是另一种处理这个问题的方法。


答案 1

为了保存不必要的对象创建

这是一个非常糟糕的主意,它会用检查和其他角落情况的处理来散落在你的代码中(并且可能最终会以空指针异常结束)!== null

现在我想知道我是否无法使用 Collections.emptyList() 消除这些空检查

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

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

但这仍然会抛出一个NullPointerException if ,所以它仍然不是你所追求的。list == null

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

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


答案 2

建议的答案是绝对正确的,只是一个小提示 - 在Java 8中,您可以使用新的Optable类来处理列表实例为null的情况,以一种功能更强大的方法。

例如,像这样:

public static List<String> addElement(List<String> list, String toAdd) {
       List<String> newList = Optional.ofNullable(list).orElse(new ArrayList<>());
       newList.add(toAdd);
       return newList;
}

在注释中的提示之后,最好替换为,以防止创建空 ArrayList 的新实例new ArrayList<>()Collections.emptyList()

public static List<String> addElement(List<String> list, String toAdd) {
   List<String> newList = Optional.ofNullable(list).orElse(Collections.emptyList());
   newList.add(toAdd);
   return newList;
}