Java-如何使用类型安全枚举作为开关大小写语句?
我正在开发一个Java程序,其中必须使用以下TypeSafeEnum(在外部组件中给出): 我的任务流程类具有以下方法: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:
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枚举的示例是我没有想到的一个替代方法。为了更有用,字符串大小写应该使用常量。否则,客户机代码开始在所有地方复制这些字符串。换句话说:坏代码开始产生更多的坏代码。我没有想到的另一个选择。为了更有用,字符串大小写应该使用常量。否则,客户机代码开始在所有地方复制这些字符串。换句话说:坏代码开始创建更多的坏代码。