首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Collections.emptyList()而不是空检查?

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

Stack Overflow用户
提问于 2011-07-01 10:40:20
回答 9查看 79.4K关注 0票数 24

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

代码语言:javascript
运行
复制
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签入,如下所示:

代码语言:javascript
运行
复制
if (list == Collections.<Object>emptyList())
    list = new ArrayList<Object>();

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

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

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2011-07-01 10:42:37

以节省不必要的对象创建()

这是一个非常糟糕的主意,它将乱扔您的代码与== null检查和其他处理角落的情况(并且想必结束为空指针异常无论如何!)

现在我在想,如果我不能使用Collections.emptyList()消除空检查的话,

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

代码语言:javascript
运行
复制
if (list.equals(Collections.<Object>emptyList()))

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

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

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

票数 22
EN

Stack Overflow用户

发布于 2016-08-30 06:53:48

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

例如,如下所示:

代码语言:javascript
运行
复制
public static List<String> addElement(List<String> list, String toAdd) {
       List<String> newList = Optional.ofNullable(list).orElse(new ArrayList<>());
       newList.add(toAdd);
       return newList;
}

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

代码语言:javascript
运行
复制
public static List<String> addElement(List<String> list, String toAdd) {
   List<String> newList = Optional.ofNullable(list).orElse(Collections.emptyList());
   newList.add(toAdd);
   return newList;
}
票数 21
EN

Stack Overflow用户

发布于 2019-12-17 14:03:58

emptyIfNull中有一个package org.apache.commons.collections4;方法。如果提供的列表为null,则返回空列表。

代码语言:javascript
运行
复制
List<Object> list = CollectionUtils.emptyIfNull(list);
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6546875

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档