2017-05-31 61 views
2

我必须为所有开关情况定义ENUM。我不确定在涉及头寸时如何与枚举关联。以下是我的代码:如何定义与位置相关的开关情况的枚举

public enum Choice { 
    A, B, C 
} 

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

为什么不能'位置'是一个枚举类型? – Bathsheba

+0

Choice.values()会给你一个枚举数组(带有它们的序数位置) –

回答

1

您将需要改造INT位置,以各自的ENUM。每个枚举值默认都有一个序号。这里在Choice枚举中,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; 
    } 
} 
+0

谢谢你的工作。但是我的工作室警告我不要使用“null”作为“selectedChoice”。说有风险 – user45678

+0

是的,你可以做两件事,然后 1.在ENUM中添加一个条目(可能是最后一个)为UNKNOWN并初始化selectedChoice为UNKNOWN。在切换情况下,当它发生UNKNOWN的情况下,您可以抛出异常或通知呼叫者/用户它不是有效位置 2.调用getChoiceFromPosition()并且selectedChoice仍然为空后,则抛出异常或通知呼叫者/用户,它不是一个有效的位置 – JTeam

3

通常,这是个坏主意。然而,为了一个序转换成它的枚举represantation你可能想这样做:

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

下面你可以找到从Item 31: Use instance fields instead of ordinals(有效的Java,158页,约书亚·布洛克),其中描述了如何避免使用裁剪序。

永远不要从它的序号派生与枚举相关联的值;存储 它的一个实例字段,而不是

// 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; 
    } 
} 
5

也改用枚举直接在交换机

public void selectItem(Choice x) { 
    switch (x) { 
     // Dashboard 
     case A: 
     break; 
     case B: 
     break; 
    } 
} 
2
public enum Choice { 
    A, B, C 
} 

public Choice selectItem(int position) { 
    return Choice.values()[position]; 
} 
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. 
    } 
} 
+2

我认为你的意思是“序数”,而不是“红衣主教”。 –

+0

@AndyTurner,是的。你是对的! –

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语句的需要。