如果在某些类中有一个很少使用的集合可能会被实例化很多次,我有时可能会使用以下“成语”来保存不必要的对象创建:
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()签入真的很难看.我想知道是否有更好的方法来做这件事,甚至还有其他方法来处理这个问题。
发布于 2011-07-01 10:42:37
以节省不必要的对象创建()
这是一个非常糟糕的主意,它将乱扔您的代码与== null
检查和其他处理角落的情况(并且想必结束为空指针异常无论如何!)
现在我在想,如果我不能使用
Collections.emptyList()
消除空检查的话,
不,不是真的。emptyList()
返回一个空列表。你可以
if (list.equals(Collections.<Object>emptyList()))
但是这仍然会抛出一个NullPointerException如果list == null
,所以它仍然不是你想要的。
我的建议是:始终将列表初始化为new ArrayList<Object>
,或者,如果您希望从方法返回空列表,则使用Collections.emptyList()
。(这每次都会返回相同的实例,因此也不会有不必要的对象创建。)
然后使用.isEmpty()
检查集合是否为空。
发布于 2016-08-30 06:53:48
建议的答案是绝对正确的,只是小小的提示--在Java 8中,您可以使用新的可选类来处理列表实例为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;
}
按照注释中的提示,最好将new ArrayList<>()
替换为Collections.emptyList()
,以防止创建空ArrayList的新实例
public static List<String> addElement(List<String> list, String toAdd) {
List<String> newList = Optional.ofNullable(list).orElse(Collections.emptyList());
newList.add(toAdd);
return newList;
}
发布于 2019-12-17 14:03:58
在emptyIfNull
中有一个package org.apache.commons.collections4;
方法。如果提供的列表为null,则返回空列表。
List<Object> list = CollectionUtils.emptyIfNull(list);
https://stackoverflow.com/questions/6546875
复制相似问题