如何定义与positon相关的Switch案例的枚举

时间:2017-05-31 07:18:35

标签: java android enums

我必须为所有Switch案例定义ENUM。我不确定如何将enums与职位联系起来。以下是我的代码:

public enum Choice {
    A, B, C
}

public void selectItem(int position) {
    switch (position) {
        // Dashboard
        case 0:
        break;
        case 1:
        break;
    }
}

6 个答案:

答案 0 :(得分:5)

请改为直接在开关

中使用枚举
public void selectItem(Choice x) {
    switch (x) {
        // Dashboard
        case A:
        break;
        case B:
        break;
    }
}

答案 1 :(得分:3)

一般来说,这是个坏主意。但是,要将序数转换为enum represantation,您可能希望这样做:

Choice value = Choice.values()[position];

下面你可以从 Item 31: Use instance fields instead of ordinals (Effective Java,第158页,Joshua Bloch)中找到剪辑,其中描述了如何避免使用序数。

  

永远不要从序数中获取与枚举相关的值;商店   它在实例字段中改为

// Abuse of ordinal to derive an associated value - DON'T DO THIS
public enum Ensemble {
   SOLO,   DUET,   TRIO, QUARTET, QUINTET,
   SEXTET, SEPTET, OCTET, NONET,  DECTET;

   public int numberOfMusicians() {
      return ordinal() + 1;
   }
}

public enum Ensemble {
   SOLO(1), DUET(2), TRIO(3), QUARTET(4), QUINTET(5),
   SEXTET(6), SEPTET(7), OCTET(8), DOUBLE_QUARTET(8),
   NONET(9), DECTET(10), TRIPLE_QUARTET(12);

   private final int numberOfMusicians;

   Ensemble(int size) {
      this.numberOfMusicians = size;
   }

   public int numberOfMusicians() {
      return numberOfMusicians;
   }
}

答案 2 :(得分:2)

public enum Choice {
    A, B, C
}

public Choice selectItem(int position) {
    return Choice.values()[position];
}

答案 3 :(得分:2)

您可以尝试在枚举中添加一些方法来包含逻辑。

public enum Choice {
    A, B, C;
    static Choice[] values = Choice.values(); //so array not created defined every time.

    public static Choice fromOrdinal(int position){
        if(position<values.length){
            return values[position];
        } 
        return A; //default
    }
}

//例如,当在android中选择一个微调器时,它返回一个int位置。

//将此位置映射到枚举,您可以调用fromOrdinal()方法,如下所示。

public void selectItem(int position) {
    switch (Choice.fromOrdinal(position)) {
        // Dashboard
        case A:
        break;
        case B:
        break;
        ...// the rest of your cases.
    }
}

答案 4 :(得分:1)

您需要将int位置转换为相应的ENUM。默认情况下,每个枚举值都有一个序数。在选择枚举中,A有零序等等。

public class TestMain {

  public enum Choice {
    A, B, C
  }

  public static void main(String[] args) {
    selectItem(0);
  }

  public static void selectItem(int position) {
    Choice selectedChoice = null;
    selectedChoice = getChoiceFromPosition(position, selectedChoice);

    switch (selectedChoice) {
      //Dashboard
      case A:
        System.out.println(selectedChoice.ordinal());
        break;
      case B:
        break;
      case C:
        break;
    }
  }

  private static Choice getChoiceFromPosition(int position, Choice selectedChoice) {
    for(Choice c : Choice.values()){
      if(c.ordinal() == position) {
        selectedChoice =c;
      }
    }
    return selectedChoice;
  }
}

答案 5 :(得分:0)

这里有很多好的答案。只需添加一个非常优雅且值得考虑的内容。

您可以让enum完成所有工作。

interface Selectable {
    public void selected();
}

public enum Choice implements Selectable {
    A {
        @Override
        public void selected() {
            System.out.println("We're all going to die!!!");
        }
    }, B{
        @Override
        public void selected() {
            System.out.println("Everyone lives forever");
        }
    }, C{
        @Override
        public void selected() {
            System.out.println("Nobody knows.");
        }
    };
}

这实际上完全消除了对switch ... case语句的需要。