我有以下代码
public interface EnumInterface{
public String getTitle();
}
public enum Enum1 extends EnumInterface{
private String title;
Enum1(String title){
this.title = title;
}
A("Apple"),B("Ball");
@Override
public String getTitle(){
return title;
}
}
public enum Enum2 extends EnumInterface{
private String title;
Enum1(String title){
this.title = title;
}
C("Cat"),D("Doll");
@Override
public String getTitle(){
return title;
}
}
我在其他课堂上使用它如下
private EnumInterface[] enumList;//declared globally.
if(flagTrue){
enumList = Enum1.values();
}else{
enumList = Enum2.values();
}
....
....
private method1(int position){
switch(enumList[postion]){
case A:....
break;
case B:....
break;
case C:....
break;
case D:....
break;
}
}
我得到以下编译时间错误
无法打开EnumInterface类型的值。只允许可转换的int值或枚举变量。
我做了研究,发现如果我这样做,“开关”的情况是不可能的。
在这种情况下,Switch语句绝对不是您想要的。即使上面的示例有效,并且没有原因,您的结果也会完全错误。枚举上的开关使用枚举序号,对于Enum1. A
,1表示Enum1. B
,0表示Enum2.C
,1表示Enum2.D
使用上面的类。你可以看到为什么这是一个非常糟糕的主意。
您的EnumInterface
类与Java类型enum
没有任何关系,它只是定义了实现它的任何类,并提供了您的getTitle()
方法。这可能是Enum1
,Enum2
,或者任何其他甚至可能不是Enum的类。因此,当您想基于EnumInterface
进行切换时,您需要问自己真正想要打开的是什么。它是您想要用作条件的标题,还是您定义的枚举带来了其他东西?
现在,我要让你从怀疑中受益,并假设无论你想做什么,它都需要从Enum中获得。我还将假设你不能出于任何原因组合Enum1
或Enum2
。下面是我为您提供的完全过度设计的解决方案:
public interface EnumInterface {
public String getTitle();
public void processEvent(SwitchLogicClass e);
}
public enum Enum1 implements EnumInterface{
A("Apple"){
public void processEvent(SwitchLogicClass e){
//Any A specific Logic
e.doSomethingA();
}
},
B("Ball"){
public void processEvent(SwitchLogicClass e){
//Any B specific Logic
e.doSomethingB();
}
};
private String title;
Enum1(String title){
this.title = title;
}
@Override
public String getTitle(){
return title;
}
}
对Enum2重复。假设下一个类称为SwitchLogicClass
private EnumInterface[] enumList;//declared globally.
if(flagTrue){
enumList = Enum1.values();
}else{
enumList = Enum2.values();
}
....
....
private method1(int position){
EnumInterface[position].processEvent(this);
}
public void doSomethingA(){
//Whatever you needed to switch on A for
}
public void doSomethingB(){
//Whatever you needed to switch on B for
}
....
....
您几乎肯定需要根据您需要使用的任何抽象模式进行重构,但以上是我对您的代码的了解所能做的最好的事情。
扩展完成了什么不能使用简单的java枚举完成的任务?您可以使用if else
块并调用equals
方法。