Как я могу преобразовать значение в перечисление? - PullRequest
2 голосов
/ 15 октября 2010

У меня есть enum, который выглядит примерно так:

public enum Numbers {
  ONE(1), TWO(2), THREE(3);

  public final int num;

  public Numbers(int num) {
    this.num = num;
  }
}

Я хочу иметь возможность преобразовать аргумент в enum, например, из int 1 в enum ONE. Есть ли в Java Enums какой-либо встроенный механизм для этого или мне нужно написать собственную логику для этого?

Ответы [ 3 ]

8 голосов
/ 15 октября 2010

Да, вы должны написать свою собственную логику, так как переменная num является частью вашей собственной логики:

public enum Numbers {
    ONE(1), TWO(2), THREE(3);

    public final int num;

    private Numbers(int num) {
        this.num = num;
    }

    public static Numbers getNumber(int i){
        for(Numbers number : Numbers.values()){
            if(i == number.num){
                return number;
            }
        }
        throw new IllegalArgumentException("This number doesn't exist");
    }
}
1 голос
/ 15 октября 2010

Если вы хотите перейти от ординала, вы должны сделать это самостоятельно.Однако существует автоматическое преобразование из имени перечисления.Между прочим, нет необходимости указывать порядковый номер, который выполняется автоматически и начинается с 0, а есть порядковый номер ().

Enum.valueOf(Numbers.class, "ONE")

вернул бы Numbers.ONE

0 голосов
/ 15 октября 2010

Если вместо этого вы можете начать свое конкретное перечисление с ZERO, вы можете сделать

// ...
private static final Numbers[] list = values();
public static Numbers get(int which) { return list[i]; }
// ...

и игнорируйте присвоение индексов вашему перечислению.

РЕДАКТИРОВАТЬ: опция безопасного рефакторинга:

//..
private static final Map<Integer, Numbers> getter; static {
 Numbers[] ns = values();
 getter = new HashMap<Integer, Numbers>(ns.length, 1f);
 for (Numbers n : ns) getter.put(n.num, n);
}
public static Numbers get(int which) { return getter.get(which); }
//..

это также способствует изменению индекса на любой тип, который вам нравится, и возвращает ноль вместо того, чтобы выдавать исключение, если вы запрашиваете мусор (который может быть предпочтительным).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...