枚举从数组,最短的变体?

我需要一个来自数组(通过varargs方法参数给出)。首先,我很惊讶(有)。)中没有 varargs 构造函数方法。作为解决方法,我使用以下变体:EnumSetEnumSetEnumSet#of(E first, E... rest)

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

但是,这会触发 .所以,现在我最终得到了以下内容,这看起来有些荒谬:java.lang.IllegalArgumentException: Collection is empty

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

当然,这可以转移到一些实用方法,但仍然,我问自己是否有一种更简单的方法使用现有方法?


答案 1

这是两行,但稍微不那么复杂:

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

我不认为这比没有你想要的构造函数的类的任何其他类型的变量声明更糟糕:

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

答案 2

只是一个替代方案。相同数量的代码,除了不需要转换为列表,使用EnumSet.of()

EnumSet<Options> temp = options.length > 0 ? 
                        EnumSet.of(options[0], options) : 
                        EnumSet.noneOf(Options.class);

不用担心第一个元素是重复的(无论如何它都不会在集合中重复),也没有性能提升或损失。