问题标签 [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.
java - 打开枚举集
旧的方式,如果我们想要switch
一些复杂的位掩码,我们可以很容易地这样做(我头脑中的一个随机示例只是为了演示这个问题):
如今,由于我们使用enums
and EnumSets
,我有时想做类似的事情:
这是行不通的,因为我们只能switch
使用int
,enum
或String
值。在这一点上,我意识到这是不可能的,即使这些enum
值基本上只是隐藏的整数。但我喜欢四处挖掘,该功能看起来非常有用,所以:
仍然没有运气。知道打开字符串的技巧并且 EnumSets 实际上是 64 位字段(或它们的数组),我也会尝试:
认为当Human
hashCode()
正确实施以产生一致的结果时,它可能会起作用。没有:
java.lang.Error:未解决的编译问题:case 表达式必须是常量表达式
现在,我想知道为什么没有可能做到这一点。我一直认为,enums
在EnumSets
Java 中,它是那些老式位域的适当替代品,但在这里,新方法似乎无法处理更复杂的情况。
与任何可能性相比,正确的解决方案很糟糕:switch
特别是,自从引入了switch
on ,我相信onStrings
至少有两种可能的实现:switch
EnumSets
- 在
case (Human.MAN | Human.DEAD)
表达式中,简单地使用编译时类型检查而ordinal()
不是枚举本身。 - 使用与 Strings 相同的技巧。
- 在编译时,计算枚举值的 (可能还有一些额外的东西 - 枚举中的值的数量
hashCode()
等name
ordinal()
- 从编译时开始,一切都是静态和恒定的)。是的,这将意味着更改班级或hashCode()
班级。EnumSet
Enum
- 使用而不是枚举本身
- 在编译时,计算枚举值的 (可能还有一些额外的东西 - 枚举中的值的数量
现在,是否有任何我没有考虑到的严重障碍(我可以想出一些,都可以很容易地克服)会使这不可能轻松实现?或者我认为这确实是可能的,但对于 Oracle 来说还不足以实现它,因为它不经常使用,这是对的吗?
另外,让我声明这是一个纯粹的学术问题,可能没有好的答案(不知道,否则我不会问)。如果它被证明是无法回答的,我可能会将其设为社区 wiki。但是,我在任何地方都找不到答案(甚至任何人都在讨论它),所以就这样吧。
java - 为什么 EnumSet 或 EnumMap 可能比它们的散列对应物性能更高?
以下来自EnumMap 的 Java 文档的实施说明部分:
实施说明:所有基本操作都在恒定时间内执行。它们很可能(尽管不能保证)比它们的 HashMap 对应物更快。
我在 java 文档中EnumSet
也看到了类似的行。我想知道为什么它比散列对应物更有可能EnumSets
并且EnumMaps
会更快?
java - 通用枚举/枚举集问题
我有一个定义如下的类和函数:
对于这两个 addAll 操作,Eclipse 都给我以下错误消息:
本质上,我需要某种形式的Enum
泛型,而我只是对似乎存在的限制感到沮丧。我有许多Enum
不兼容的类型,但我想要一些可以容纳任何类型的容器。
我认识到在这段代码中无法确定a
,b
和contents
都是同一Enum
类型,但是在实际实现中这应该没有问题。
解决我的一般Enum
问题的任何想法和可能的方法都是有价值的,我将非常感谢您的帮助。提前致谢。
java - 检查一个/或一个 EnumSet
所以我将我们应用程序中的一些位域转换为使用 EnumSet,我很好奇是否有更好的方法来比较 X|Y。目前我们正在做类似的事情:
EnumSet 等效项似乎是:
有没有更清洁的方法来做到这一点?我知道你可以这样检查containsAll()
:
但这是针对您想知道是否(X & Y)
已设置的场景。有没有等效的方法来检查(X | Y)
?我认为会有类似containsAny()
方法的东西,但我没有看到任何似乎有这种效果的东西。
java - 我的通用 EnumSet 方法 - 无法访问 Enum.values()
我正在尝试编写一个通用方法来从包含位掩码的整数初始化 EnumSet 值。我收到一个我不明白的编译器错误。这是我的代码:
编译器错误:
是否有一些特殊的语法可以访问 E 的 values() 方法?(我是 Java 菜鸟。)有人可以帮我解决这个编译器错误吗?谢谢。
java - 用 Java 编写通用枚举集小部件 - 语法不正确
我正在尝试编写一个通用小部件,它采用(任何)枚举集并弹出一个简单的表单以允许打开和关闭各个枚举。下面是该类的最小版本(实际上设置为在 android 上运行),但 eclipse 抱怨“AbstractCollection 类型中的方法 add(Capture#-7 of ?) 不适用于 arguments(T)”。
前几行我调用了 remove (具有完全相同的签名),没有任何问题。尝试先将枚举变成一个集合也无济于事。
我需要什么神奇的语法来解决这个问题?
我很可能也没有使用最好的类定义;)我使用的是 Android Developer Tools v21.1.0-569685,但问题也出现在 Eclipse 本身(Indigo)上
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]")
我已经以这种方式实现了这个东西:
但是,可能有一个现成的解决方案,或者一个非常简单的方法来做到这一点。
java - EnumSet 可打包
我正在编写该writeToParcel
方法,并且我的模型具有EnumSet<object>
as 属性。我不知道out.write....()
我必须为这种类型使用哪个?
java - 使用实现接口的枚举的 EnumSet
我有一个界面
一个枚举
我想做类似的事情:
这个错误是(在我的情况下):
现在我知道如果我使用Set<SomeInterface>
我可以防止这种类型的错误(并且我可以继续开发代表正式语法的类)但我想使用它,EnumSet
因为它可能比HashSet
. 我怎么解决这个问题?
java - 在 Java 中创建 EnumSet 数组
我正在尝试创建一个 EnumSet 数组(使用 Eclipse)。
版本 1:
这可行,但我收到警告:“EnumSet 是原始类型。对泛型类型 EnumSet 的引用应该被参数化”。
建议的版本 2:
再次警告:“类型安全:类型 EnumSet[] 的表达式需要未经检查的转换以符合 EnumSet[]”
建议的版本 3:
现在我得到一个错误!“无法创建 EnumSet 的通用数组”
我应该怎么办?未参数化的 EnumSet 会有性能问题吗?