2011-08-23 51 views
1

嗯,我想使這個工作switch語句:數枚舉值/ 1002 = MyEnum.NewYorkID

public static void main(String[] args) { 

    int cityId = 1234; 

    switch (cityId) { 
     case MOSCOW: 
      System.out.println("Moscow"); 
      break; 

     case SOCHI: 
      break; 
} 

public enum Test { 
    MOSCOW, 
    NEWYORK, 
    SOCHI 
} 

所以我想測試枚舉城市IDS鏈接,這可能嗎?這種情況的最佳模式是什麼?

謝謝!

+0

在何種意義上,你想這個工作? 1234的相關性是什麼? –

回答

4

不能混淆,在一個開關。您可以將Test枚舉傳遞給switch語句,也可以在case語句中使用常量標識。

我建議有一個映射cityId <-> Test instance和轉換之前調用交換機。

喜歡的東西

Map<Integer, Test>` mapping = ...; 
mapping.put(1234, Test.MOSCOW); //note the use of autoboxing 

... 

mapping.get(cityId); //note the use of autoboxing 

編輯:請注意,你可以把這個映射到枚舉,一個cityId字段添加到枚舉和自動填寫由values()返回的數組的映射,就像克里斯的建議, 。

public enum Test { 
    MOSCOW(1001), 
    NEWYORK(1002), 
    SOCHI(1234); 

    private final int cityId; 

    private Test(int cityId) { 
    this.cityId = cityId; 
    } 

    ... 


    private static Map<Integer, Test> mapping = new HashMap<Integer, Test>(); 

    static { //executed when the class is loaded 
    for(Test t : values()) { 
     mapping.put(t.getCityId(), t); 
    } 
    } 

    public static toTest(int cityId) { 
    return mapping.get(cityId); 
    } 
} 

這是我們經常爲類似的事情做的事情。

+0

大多數情況下(在我們工作的枚舉中)沒有足夠的enum常量來處理地圖方法,但我同意地圖方法有時間和地點。 :-) –

+0

@Chris是的,這是真的。然而,我們喜歡有一個共同的方法,因此我們也想要解釋大的枚舉,因此地圖(實際上我們有一個註冊表,它是地圖的地圖,它允許我們查找不同的枚舉實現一個共同的界面) - 我也假設有更多的城市來:) – Thomas

4

您的代碼唯一的問題是,您需要打開Test而不是int

即:

public static void main(String[] args) { 

    Test city = SOCHI; 

    switch (city) { 
     case MOSCOW: 
      System.out.println("Moscow"); 
     break; 

     case SOCHI: 
      break; 
} 

public enum Test{ 
    MOSCOW, 
    NEWYORK, 
    SOCHI 
} 
2

您可以在枚舉添加cityId場:

public enum Test { 
    MOSCOW(1001), 
    NEWYORK(1002), 
    SOCHI(1234); 

    private final int cityId; 

    private Test(int cityId) { 
     this.cityId = cityId; 
    } 

    public int getCityId() { 
     return cityId; 
    } 

    public static Test valueOf(int cityId) { 
     /* 
     * Using linear search because there's only a small handful 
     * of enum constants. If there's a huge amount (say, >20), 
     * a map lookup is better. 
     */ 
     for (Test value : values()) { 
      if (value.cityId == cityId) 
       return value; 
     } 
     throw new IllegalArgumentException("Unknown city ID: " + cityId); 
    } 
} 

然後你就可以在確實枚舉值切換:

switch (Test.valueOf(cityId)) { 
case MOSCOW: 
    // ... 
}