Java - 如何使用类型安全枚举作为 switch-case 语句?

标签 java enums type-safety

我正在开发一个 Java 程序,我必须使用以下 TypeSafeEnum (在外部组件中给出):

public class MyInterfaceTypeEnum
    extends TypeSafeEnum
{
    public MyInterfaceTypeEnum(String paramString, int paramInt)
    {
        super(paramString, paramInt);
    }

    public static final MyInterfaceTypeEnum UNKNOWN = new MyInterfaceTypeEnum("UNKNOWN", 0);
    public static final MyInterfaceTypeEnum TCP = new MyInterfaceTypeEnum("TCP", 10);
    public static final MyInterfaceTypeEnum UDP = new MyInterfaceTypeEnum("UDP", 20);
    public static final MyInterfaceTypeEnum IPX = new MyInterfaceTypeEnum("IPX", 30);
    public static final MyInterfaceTypeEnum RS232 = new MyInterfaceTypeEnum("RS232", 40);
}

我的任务流程类具有以下方法:

private void processInterface(MyInterfaceTypeEnum type)
{
    switch(type)
    {
    case RS232:
        {
            // do action
            break;
        }
    case TCP:
    case UDP:
        {
            // do action
            break;
        }
    case IPX:
        {
            // do action
            break;
        }
    case UNKNOWN:
    default:
        {
            // do default action
            break;
        }
    }
}

编译器在 switch 语句行上失败,并显示以下消息:

Cannot switch on a value of type MyInterfaceTypeEnum. Only convertible int values, strings or enum variables are permitted.

我用谷歌搜索,但到处都写着:这个 TypeSafeEnum 模式可能没问题。请给我一些解决这个问题的想法。

更新:

值得一提的是:我无法更改 MyInterfaceTypeEnum 的实现(它是已使用(导入)组件的一部分)。因此我被迫使用它。所以,基本情况是:“enum”(误用的类)已经给出。

如果我放弃使用MyInterfaceTypeEnum,我也将无法使用很多函数(那些大量使用这种类型安全枚举的函数)。所以我别无选择,只能接受这个事实,并尝试寻找最简单的可能性。

我知道,可以使用if-else语句树。但我想避免这种情况。由于 MyInterfaceTypeEnum 是在外部组件中添加的(由其他人实现,我无法更改它)。

最佳答案

自 java 1.5 起,Java 支持枚举

public enum Protocols {
   TCP,
   UDP,
   PCX
}

....
void processInterface(Protocols proto) {

  switch(proto) {
     case TCP: ...
     case UDP: ...
  }
} 

关于Java - 如何使用类型安全枚举作为 switch-case 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50738399/

相关文章:

java - Play 2 JPA Oracle - 即使 ebeanEnabled 在 build.scala 中设置为 false,也会出现额外列 'ebean_intercept'

java - 如何在 hibernate 中获取具有不同 HQL 的 POJO 列表?

Java将字节数组转换为十六进制字节数组

c++ - 枚举类型数据的运算符重载函数

c++枚举并使用它们从用户输入

java - java中没有找到类型的枚举常量

Java 类型安全的 equals()

java - 类型删除和集合

java - 在调用 GET 请求之前等待 POST 完成处理

java - Ant、Ivy 和 Artifactory 如何使用设置文件