If I have a rarely used collection in some class which may be instantiated many times, I may sometimes resort to the following “idiom” in order to save unnecessary object creations:
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)
;
Now I was wondering if I couldn’t eliminate those null checks using Collections.emptyList(), however then I would have to alter the if check in add() like so:
if (list == Collections.<Object>emptyList())
list = new ArrayList<Object>();
Is there a better way to handle this other than just allocating a new empty collection every time?
EDIT: just to be clear, I would like to use Collections.emptyList(), but the above check in add() is really really ugly… I was wondering if there’s a better way to do it or even a whole other way of handling this.
That’s a really bad idea which will litter your code with
== nullchecks and other handling of corner cases (and presumably end up in null pointer exceptions anyway)!No, not really.
emptyList()returns an empty list. You could dobut that will still throw a NullPointerException if
list == null, so it’s still not what you’re after.My recommendation: Always initialize the list to
new ArrayList<Object>, or, if you for instance want to return an empty list from a method, useCollections.emptyList()instead. (This returns the same instance every time, so no unnecessary object creation there either.)And then use
.isEmpty()to check if a collection is empty or not.