在Java中实现类似于可扩展枚举的东西
为了在java中的多个枚举上实现类型替换,我可以让它们都实现一个接口。但在交换机案例中使用接口对象是一项挑战在Java中实现类似于可扩展枚举的东西,java,enums,switch-statement,Java,Enums,Switch Statement,为了在java中的多个枚举上实现类型替换,我可以让它们都实现一个接口。但在交换机案例中使用接口对象是一项挑战 我不能在switch语句中直接使用接口对象。开关语句只接受enum、char、byte、short、int和string 我可以打开object.getUniqueID()其中getUniqueID是接口的成员,但在这种情况下,我必须硬编码case语句的值。在我看来,这很难看,而且几乎不可能重构 我们需要的是一个能够 可用于switch case语句,满足上述两个问题。 类型可替换。 任
object.getUniqueID()
其中getUniqueID
是接口的成员,但在这种情况下,我必须硬编码case语句的值。在我看来,这很难看,而且几乎不可能重构李>
我们需要的是一个能够
任何指针都会有帮助 您应该使用一个包含所有可能的
enum
值的枚举,或者在切换之前需要检查类型
MyInterface value = ...
if (value instanceof EnymType1) {
switch((EnumType1) value) {
case ...
}
} else if (value instanceof EnumType2) {
switch((EnumType2) value) {
case ...
}
}
您可以使用
映射来代替开关,因为它可以动态扩展,但性能与开关几乎相同。为什么您坚持在开关语句中使用它?几天前我使用了第二种解决方案。具有嵌套枚举列表类型和此枚举类型的类型字段的基类。这对我来说很好。@kocko会不会因为其他原因而变得更慢?或者您还有其他想法吗?如果您打算使用switch/case,那么扩展枚举有什么意义呢?如果有一个新的枚举值,您必须更改处理代码并重建系统,因此您最好手动将新值添加到枚举中。@biziclop,case语句不需要一个常量表达式吗?如果tMJ有很多描述符,这部分可能是一个瓶颈instanceof
的运行速度非常慢。@mkrakhin这对我来说是个新闻,你有任何基准测试来证明它吗?@mkrakhin instanceof可以用2.2秒ns@PeterLawrey没有时间构建我的jmh项目。你能和开关/箱子比较一下吗?很有趣。@tMJ您可以从多个enum
生成一个enum
,并使用它。问题是这种组合必须在编译时可用,才能使用开关