首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >数组中的EnumSet,最短的变量?

数组中的EnumSet,最短的变量?
EN

Stack Overflow用户
提问于 2014-04-06 04:20:09
回答 5查看 13.6K关注 0票数 42

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

代码语言:javascript
复制
EnumSet<Options> temp = EnumSet.copyOf(Arrays.asList(options));

但是,这会触发java.lang.IllegalArgumentException: Collection is empty。因此,现在我得出了以下结论,这看起来有点可笑:

代码语言:javascript
复制
EnumSet<Options> temp = options.length > 0 ? 
                        EnumSet.copyOf(Arrays.asList(options)) : 
                        EnumSet.noneOf(Options.class);

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-04-06 04:44:24

这是两行代码,但不太复杂:

代码语言:javascript
复制
EnumSet<Options> temp = EnumSet.noneOf(Options.class); // make an empty enumset
temp.addAll(Arrays.asList(options)); // add varargs to it

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

代码语言:javascript
复制
    SomeClass variable = new SomeClass(); // make an empty object
    variable.addStuff(stuff); // add stuff to it
票数 23
EN

Stack Overflow用户

发布于 2014-04-06 04:38:52

只是另一种选择。相同数量的代码,除了不需要转换为列表,使用EnumSet.of()

代码语言:javascript
复制
EnumSet<Options> temp = options.length > 0 ? 
                        EnumSet.of(options[0], options) : 
                        EnumSet.noneOf(Options.class);

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

票数 24
EN

Stack Overflow用户

发布于 2014-11-04 17:00:40

对于这类情况,Guava有工厂方法:它仍然需要调用Arrays.asList,但至少它是可读的。

代码语言:javascript
复制
import com.google.common.collect.Sets;

EnumSet<Options> temp = Sets.newEnumSet(Arrays.asList(options), Options.class);
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22886287

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档