Switch语句:数字到枚举值/ 1002 = MyEnum.NewYorkID

时间:2011-08-23 13:59:45

标签: java design-patterns enums

好吧,我想做这项工作

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
}

所以我想将测试枚举与城市ID联系起来,这可能吗?这种情况的最佳模式是什么?

谢谢!

3 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:4)

您不能在交换机中混用它。您可以将Test枚举传递给switch语句,或者在case语句中使用常量ID。

我建议在调用切换之前进行映射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()返回的数组中的映射,这与Chris的建议非常相似。

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);
   }
}

这是我们经常为类似事情做的事情。

答案 2 :(得分: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:
    // ...
}