Оператор переключения: число в перечисляемое значение / 1002 = MyEnum.NewYorkID - PullRequest
1 голос
/ 23 августа 2011

Ну, я хочу сделать эту работу

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
}

Итак, я хочу связать Test enum с идентификаторами городов, возможно ли это?Какой шаблон лучше всего подходит для этой ситуации?

Спасибо!

Ответы [ 3 ]

4 голосов
/ 23 августа 2011

Вы не можете смешивать это в выключателе. Либо вы передаете перечисление 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);
   }
}

Это то, что мы часто делаем для подобных вещей.

4 голосов
/ 23 августа 2011

Единственная проблема с вашим кодом заключается в том, что вам нужно включить 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 голосов
/ 23 августа 2011

Вы можете добавить поле 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:
    // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...