EnumSet from array, shortest variant?

qqilihq picture qqilihq · Apr 5, 2014 · Viewed 12.2k times · Source

I need an EnumSet from an array (which is given through a varargs method parameter). First, I was surprised that there is no varargs constructor method in EnumSet (there is EnumSet#of(E first, E... rest)). As a workaround, I used the following variant:

EnumSet<Options> temp = EnumSet.copyOf(Arrays.asList(options));

However, this triggers a java.lang.IllegalArgumentException: Collection is empty. So, now I ended up with the following, which looks somewhat ridiculous:

EnumSet<Options> temp = options.length > 0 ? 
                        EnumSet.copyOf(Arrays.asList(options)) : 
                        EnumSet.noneOf(Options.class);

If course this could be moved to some utility method, but still, I'm asking myself if there is a simpler way using existing methods?

Answer

azurefrog picture azurefrog · Apr 5, 2014

This is two lines, but slightly less complex:

EnumSet<Options> temp = EnumSet.noneOf(Options.class); // make an empty enumset
temp.addAll(Arrays.asList(options)); // add varargs to it

I don't consider this worse than any other kind of variable declaration for a class which doesn't have the constructor you want:

    SomeClass variable = new SomeClass(); // make an empty object
    variable.addStuff(stuff); // add stuff to it