如果我在某个类中有一个很少使用的集合,该集合可能被实例化很多次,则有时我可能会求助于以下“习惯用法”以节省不必要的对象创建:
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检查:
Collections.emptyList()
add()
if (list == Collections.<Object>emptyList()) list = new ArrayList<Object>();
除了每次都分配一个新的空集合以外,还有更好的方法来处理此问题吗?
编辑: 为了清楚起见,我 想 使用Collections.emptyList(),但是在add()中进行上述检查确实非常丑陋……我想知道是否有更好的方法甚至是其他方法处理这个。
为了节省不必要的对象创建
这是一个非常糟糕的主意,它将使== null检查和其他处理极端情况的代码变得乱七八糟(无论如何最终都会导致空指针异常)!
== null
现在我想知道是否无法使用Collections.emptyList()
不,不是。emptyList()返回一个空列表。你 可以 做
emptyList()
if (list.equals(Collections.<Object>emptyList()))
但是,如果list == null,它仍然会抛出NullPointerException ,所以它仍然不是您想要的。
list == null
我的建议:始终将列表初始化为new ArrayList<Object>,或者,例如,如果要从方法返回空列表,请Collections.emptyList()改用。(这每次都会返回相同的实例,因此也不会在其中创建不必要的对象。)
new ArrayList<Object>
然后使用.isEmpty()来检查集合是否为空。
.isEmpty()