问题标签 [enumset]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
2924 浏览

java - 打开枚举集

旧的方式,如果我们想要switch一些复杂的位掩码,我们可以很容易地这样做(我头脑中的一个随机示例只是为了演示这个问题):

如今,由于我们使用enumsand EnumSets,我有时想做类似的事情:

这是行不通的,因为我们只能switch使用int,enumString值。在这一点上,我意识到这是不可能的,即使这些enum值基本上只是隐藏的整数。但我喜欢四处挖掘,该功能看起来非常有用,所以:

仍然没有运气。知道打开字符串的技巧并且 EnumSets 实际上是 64 位字段(或它们的数组),我也会尝试:

认为当Human hashCode()正确实施以产生一致的结果时,它可能会起作用。没有:

java.lang.Error:未解决的编译问题:case 表达式必须是常量表达式


现在,我想知道为什么没有可能做到这一点。我一直认为,enumsEnumSetsJava 中,它是那些老式位域的适当替代品,但在这里,新方法似乎无法处理更复杂的情况。

与任何可能性相比,正确的解决方案很糟糕:switch

特别是,自从引入了switchon ,我相信onStrings至少有两种可能的实现:switchEnumSets

  1. case (Human.MAN | Human.DEAD)表达式中,简单地使用编译时类型检查而ordinal()不是枚举本身。
  2. 使用与 Strings 相同的技巧
    • 在编译时,计算枚举值的 (可能还有一些额外的东西 - 枚举中的值的数量hashCode() nameordinal()- 从编译时开始,一切都是静态和恒定的)。是的,这将意味着更改班级或hashCode()班级。EnumSetEnum
    • 使用而不是枚举本身

现在,是否有任何我没有考虑到的严重障碍(我可以想出一些,都可以很容易地克服)会使这不可能轻松实现?或者我认为这确实是可能的,但对于 Oracle 来说还不足以实现它,因为它不经常使用,这是对的吗?


另外,让我声明这是一个纯粹的学术问题,可能没有好的答案(不知道,否则我不会问)。如果它被证明是无法回答的,我可能会将其设为社区 wiki。但是,我在任何地方都找不到答案(甚至任何人都在讨论它),所以就这样吧。

0 投票
2 回答
3897 浏览

java - 为什么 EnumSet 或 EnumMap 可能比它们的散列对应物性能更高?

以下来自EnumMap 的 Java 文档的实施说明部分:

实施说明:所有基本操作都在恒定时间内执行。它们很可能(尽管不能保证)比它们的 HashMap 对应物更快。

我在 java 文档中EnumSet也看到了类似的行。我想知道为什么它比散列对应物更有可能EnumSets并且EnumMaps会更快?

0 投票
1 回答
824 浏览

java - 通用枚举/枚举集问题

我有一个定义如下的类和函数:

对于这两个 addAll 操作,Eclipse 都给我以下错误消息:

本质上,我需要某种形式的Enum泛型,而我只是对似乎存在的限制感到沮丧。我有许多Enum不兼容的类型,但我想要一些可以容纳任何类型的容器。

我认识到在这段代码中无法确定a,bcontents都是同一Enum类型,但是在实际实现中这应该没有问题。

解决我的一般Enum问题的任何想法和可能的方法都是有价值的,我将非常感谢您的帮助。提前致谢。

0 投票
3 回答
3836 浏览

java - 检查一个/或一个 EnumSet

所以我将我们应用程序中的一些位域转换为使用 EnumSet,我很好奇是否有更好的方法来比较 X|Y。目前我们正在做类似的事情:

EnumSet 等效项似乎是:

有没有更清洁的方法来做到这一点?我知道你可以这样检查containsAll()

但这是针对您想知道是否(X & Y)已设置的场景。有没有等效的方法来检查(X | Y)?我认为会有类似containsAny()方法的东西,但我没有看到任何似乎有这种效果的东西。

0 投票
2 回答
1349 浏览

java - 我的通用 EnumSet 方法 - 无法访问 Enum.values()

我正在尝试编写一个通用方法来从包含位掩码的整数初始化 EnumSet 值。我收到一个我不明白的编译器错误。这是我的代码:

编译器错误:

是否有一些特殊的语法可以访问 E 的 values() 方法?(我是 Java 菜鸟。)有人可以帮我解决这个编译器错误吗?谢谢。

0 投票
1 回答
339 浏览

java - 用 Java 编写通用枚举集小部件 - 语法不正确

我正在尝试编写一个通用小部件,它采用(任何)枚举集并弹出一个简单的表单以允许打开和关闭各个枚举。下面是该类的最小版本(实际上设置为在 android 上运行),但 eclipse 抱怨“AbstractCollection 类型中的方法 add(Capture#-7 of ?) 不适用于 arguments(T)”。

前几行我调用了 remove (具有完全相同的签名),没有任何问题。尝试先将枚举变成一个集合也无济于事。

我需要什么神奇的语法来解决这个问题?

我很可能也没有使用最好的类定义;)我使用的是 Android Developer Tools v21.1.0-569685,但问题也出现在 Eclipse 本身(Indigo)上

0 投票
3 回答
4301 浏览

java - 从字符串反序列化 EnumSet 的优雅方法

我想将一些序列化为EnumSet<FooType>使用String它的toString()方法。

例如:EnumSet.of(FooType.COMMON, FooType.MEDIUM).toString()会给[COMMON, MEDIUM]

问题是关于将这样的字符串反序列化回EnumSet<FooSet>. 我正在寻找一些众所周知的库(可能像apache-commons)或用于此类事物的标准 Util 类。

就像是:EnumSetUtil.valueOf(FooType.class, "[COMMON, MEDIUM]")

我已经以这种方式实现了这个东西:

但是,可能有一个现成的解决方案,或者一个非常简单的方法来做到这一点。

0 投票
1 回答
1271 浏览

java - EnumSet 可打包

我正在编写该writeToParcel方法,并且我的模型具有EnumSet<object>as 属性。我不知道out.write....()我必须为这种类型使用哪个?

0 投票
3 回答
1620 浏览

java - 使用实现接口的枚举的 EnumSet

我有一个界面

一个枚举

我想做类似的事情:

这个错误是(在我的情况下):

现在我知道如果我使用Set<SomeInterface>我可以防止这种类型的错误(并且我可以继续开发代表正式语法的类)但我想使用它,EnumSet因为它可能比HashSet. 我怎么解决这个问题?

0 投票
2 回答
1502 浏览

java - 在 Java 中创建 EnumSet 数组

我正在尝试创建一个 EnumSet 数组(使用 Eclipse)。

版本 1:

这可行,但我收到警告:“EnumSet 是原始类型。对泛型类型 EnumSet 的引用应该被参数化”。

建议的版本 2:

再次警告:“类型安全:类型 EnumSet[] 的表达式需要未经检查的转换以符合 EnumSet[]”

建议的版本 3:

现在我得到一个错误!“无法创建 EnumSet 的通用数组”

我应该怎么办?未参数化的 EnumSet 会有性能问题吗?