Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-如何使用类型安全枚举作为开关大小写语句?_Java_Enums_Type Safety - Fatal编程技术网

Java-如何使用类型安全枚举作为开关大小写语句?

Java-如何使用类型安全枚举作为开关大小写语句?,java,enums,type-safety,Java,Enums,Type Safety,我正在开发一个Java程序,其中必须使用以下TypeSafeEnum(在外部组件中给出): 我的任务流程类具有以下方法: private void processInterface(MyInterfaceTypeEnum type) { switch(type) { case RS232: { // do action break; } case TCP: case UDP:

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

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

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语句行失败,并显示以下消息:

无法打开MyInterfaceTyPeaneum类型的值。仅可转换整数 允许使用值、字符串或枚举变量

我用谷歌搜索,但到处都写着:这个TypeSafeEnum模式可能没问题。请告诉我如何解决这个问题

更新:

重要提示:MyInterfaceTypeaneum的实现不能由我更改(它是已使用(导入)组件的一部分)。因此我不得不使用它。所以,基本情况是:已经给出了“enum”(误用类)

如果我放弃使用
myinterfacetypenum
,我也将无法使用很多函数(那些密集使用这种类型安全枚举的函数)。因此,我别无选择,只能接受这一点,并试图找到最简单的可能性


我知道,如果不是这样,可以使用语句树。但我想避免这种情况。因为
MyInterfaceTypeanum
是在外部组件中添加的(由其他人实现,我无法更改)。

因为java中支持java 1.5枚举

public enum Protocols {
   TCP,
   UDP,
   PCX
}

....
void processInterface(Protocols proto) {

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

因为java支持java 1.5枚举

public enum Protocols {
   TCP,
   UDP,
   PCX
}

....
void processInterface(Protocols proto) {

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

周围没有工作。简单明了

内置switch语句仅适用于int、String或(内置)enum值。正如错误信息告诉你的那样。 因此,留给您的是if/else链,或者可能是if语句的级联,每个if块中都有一个return语句


或者,您可以创建一个真正的Java枚举,它围绕您现有的已损坏的枚举类。换句话说:您创建了一个额外的保护层,这样您将创建的所有代码都不会受到强制使用的枚举类的影响。甚至还有一个名称:反腐败层

没有解决办法。简单明了

内置switch语句仅适用于int、String或(内置)enum值。正如错误信息告诉你的那样。 因此,留给您的是if/else链,或者可能是if语句的级联,每个if块中都有一个return语句


或者,您可以创建一个真正的Java枚举,它围绕您现有的已损坏的枚举类。换句话说:您创建了一个额外的保护层,这样您将创建的所有代码都不会受到强制使用的枚举类的影响。甚至还有一个名称:反腐败层

如果您在带有公共访问getter的TypeSafeEnum中有一个字段名或字段值,它确实存储构造函数TypeSafeEnum的值(String paramString,int paramInt),您可以:

private void processInterface(MyInterfaceTypeEnum type){
switch(type.getName()) {
case "RS232":
    {
        // do action
        break;
    }
case "TCP":

或者使用getter for value执行类似操作(这样可读性会降低)@GhostCat将您的类包装成真正的枚举的方法在我看来更好

如果您在带有公共访问getter的TypeSafeEnum中有一个字段名或字段值,它确实存储构造函数TypeSafeEnum的值(String paramString,int paramInt),您可以:

private void processInterface(MyInterfaceTypeEnum type){
switch(type.getName()) {
case "RS232":
    {
        // do action
        break;
    }
case "TCP":

或者使用getter for value执行类似操作(这样可读性会降低)@GhostCat将您的类包装成真正的枚举的方法在我看来更好

开关大小写仅适用于实际的Java枚举。您一直在使用大量if-else。这不是java枚举。@Herr Derb:“java枚举”在此上下文中是什么意思?@A.V.它的意思是
enum
关键字枚举。您当前正在错误使用类来使用枚举。这绝对不推荐。为此使用java枚举类型,使用switch case不会有任何问题。java枚举开关的示例仅适用于实际的java枚举。您一直在使用大量if-else。这不是java枚举。@Herr Derb:“java枚举”在此上下文中是什么意思?@A.V.它的意思是
enum
关键字枚举。您当前正在错误使用类来使用枚举。这绝对不推荐。为此使用java枚举类型,使用switch case不会有任何问题。java枚举的示例是我没有想到的一个替代方法。为了更有用,字符串大小写应该使用常量。否则,客户机代码开始在所有地方复制这些字符串。换句话说:坏代码开始产生更多的坏代码。我没有想到的另一个选择。为了更有用,字符串大小写应该使用常量。否则,客户机代码开始在所有地方复制这些字符串。换句话说:坏代码开始创建更多的坏代码。