我需要一个来自数组的EnumSet
(它是通过varargs方法参数给出的)。首先,我很惊讶在EnumSet
中没有EnumSet#of(E first, E... rest)
构造函数方法(有varargs )。作为一种解决方法,我使用了以下变体:
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);
当然,这可以转移到一些实用方法,但我仍然在问自己,是否有更简单的方法使用现有的方法?
发布于 2014-04-06 04:44:24
这是两行代码,但不太复杂:
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
发布于 2014-04-06 04:38:52
只是另一种选择。相同数量的代码,除了不需要转换为列表,使用EnumSet.of():
EnumSet<Options> temp = options.length > 0 ?
EnumSet.of(options[0], options) :
EnumSet.noneOf(Options.class);
不用担心第一个元素被重复(它无论如何都不会在一个集合中重复),也不会带来性能上的提升或损失。
发布于 2014-11-04 17:00:40
对于这类情况,Guava有工厂方法:它仍然需要调用Arrays.asList,但至少它是可读的。
import com.google.common.collect.Sets;
EnumSet<Options> temp = Sets.newEnumSet(Arrays.asList(options), Options.class);
https://stackoverflow.com/questions/22886287
复制相似问题