在Java中实现类似于可扩展枚举的东西

在Java中实现类似于可扩展枚举的东西,java,enums,switch-statement,Java,Enums,Switch Statement,为了在java中的多个枚举上实现类型替换,我可以让它们都实现一个接口。但在交换机案例中使用接口对象是一项挑战 我不能在switch语句中直接使用接口对象。开关语句只接受enum、char、byte、short、int和string 我可以打开object.getUniqueID()其中getUniqueID是接口的成员,但在这种情况下,我必须硬编码case语句的值。在我看来,这很难看,而且几乎不可能重构 我们需要的是一个能够 可用于switch case语句,满足上述两个问题。 类型可替换。 任

为了在java中的多个枚举上实现类型替换,我可以让它们都实现一个接口。但在交换机案例中使用接口对象是一项挑战

  • 我不能在switch语句中直接使用接口对象。开关语句只接受enum、char、byte、short、int和string
  • 我可以打开
    object.getUniqueID()
    其中
    getUniqueID
    是接口的成员,但在这种情况下,我必须硬编码case语句的值。在我看来,这很难看,而且几乎不可能重构 我们需要的是一个能够

  • 可用于switch 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
    ,并使用它。问题是这种组合必须在编译时可用,才能使用
    开关