用于switch语句的Java扩展枚举

时间:2014-03-31 14:59:17

标签: java android enums switch-statement

我有以下代码

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 个答案:

答案 0 :(得分:2)

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

您的EnumInterface类不以任何方式与Java类型enum绑定,它只定义实现它的任何类并提供您的getTitle()方法。这可能是Enum1Enum2或任何其他甚至可能不是枚举的类。因此,当您想要根据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
}

....
....

你几乎肯定需要根据你需要使用的抽象模式进行重构,但上面是我能用你所知道的代码做的最好的。

答案 1 :(得分:0)

使用简单的java enum可以完成哪些扩展工作? 您可以使用if else块并调用equals方法。