提问者:小点点

Java开关语句的扩展枚举


我有以下代码

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值或枚举变量。

我做了研究,发现如果我这样做,“开关”的情况是不可能的。


共2个答案

匿名用户

在这种情况下,Switch语句绝对不是您想要的。即使上面的示例有效,并且没有原因,您的结果也会完全错误。枚举上的开关使用枚举序号,对于Enum1. A,1表示Enum1. B,0表示Enum2.C,1表示Enum2.D使用上面的类。你可以看到为什么这是一个非常糟糕的主意。

您的EnumInterface类与Java类型enum没有任何关系,它只是定义了实现它的任何类,并提供了您的getTitle()方法。这可能是Enum1Enum2,或者任何其他甚至可能不是Enum的类。因此,当您想基于EnumInterface进行切换时,您需要问自己真正想要打开的是什么。它是您想要用作条件的标题,还是您定义的枚举带来了其他东西?

现在,我要让你从怀疑中受益,并假设无论你想做什么,它都需要从Enum中获得。我还将假设你不能出于任何原因组合Enum1Enum2。下面是我为您提供的完全过度设计的解决方案:

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方法。