2017-05-31 39 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語句的需要。