Порядковый номер литерального перечисления в Java - PullRequest
0 голосов
/ 03 июня 2011

С учетом следующих определений:

public enum SampleEnum1 { Uno, Dos, Tres }
public enum SampleEnum2 { One, Two, Three, Four }

Мне нужно два способа сделать это:

  • Учитывая целое число 2, вернуть Dos, если применяется к SampleEnum1, Two, если применяется к SampleEnum2
  • Учитывая значение One, вернуть 1

На самом деле мне нужно перевести буквенное перечисление в его порядковый номер в определении перечисления, и наоборот.

Я не против использования обобщений, рефлексии или чего-либо еще, если для любого перечисления работают те же 2 метода.

У вас есть решение?

Ответы [ 3 ]

1 голос
/ 03 июня 2011

Другой подход заключается в использовании вспомогательного метода, такого как

public static <E etxends Enum<E>> E lookup(Class<E> eClass, int number) {
     return eClass.getEnumConstants()[number-1];
}

SampleEnum1 se1 = lookup(SampleEnum1.class, 2);

Кстати: вы можете начать с нуля, который также упростит ваш код.

1 голос
/ 03 июня 2011

Прямое направление может быть выполнено с использованием метода Class.getEnumConstants():

  public static <E extends Enum<E>> E getValue(Class<E> eClass, int index) { 
      return eClass.getEnumConstants()[index - 1];
  }

Вызывается следующим образом:

  SampleEnum2 two = getValue(SampleEnum2.class, 2);

(К сожалению, мы не можем написать универсальный метод, который использует метод values(), который есть у каждого enum. Он статический, поэтому мы не можем получить к нему доступ полиморфным способом. Для рефлексивного доступа к нему нам потребуется чтобы знать фактический класс E ... и для этого требуется объект Class<E>. И если вам нужно передать его, вы также можете вызвать его метод getEnumConstants.)


Обратное направление проще:

  public static <E extends Enum<E>> int getIndex(E e) { 
      return e.ordinal() + 1; 
  }

Конечно, гораздо лучше, если вы следуете обычному IT-соглашению, когда индексы коллекции начинаются с нуля.

1 голос
/ 03 июня 2011

Если вы можете быть уверены, что сохраните свои перечисления в порядке в исходном файле, вы можете сделать это, чтобы получить перечисление по номеру:

public static SampleEnum1 getSpanishEnum(int index) {
    return SampleEnum1.values()[index - 1];
}

public static SampleEnum2 getEnglishEnum(int index) {
    return SampleEnum2.values()[index - 1];
}

А чтобы пойти другим путем, вы можете сделатьцикл

public static <E extends Enum> getEnumIndex(E value, E[] values) {
    for(int i = 0; i < values.length; i++) {
        if(value == values[i]) {
            return i + 1;
        }
    }
    throw new NoSuchElementException();
}

, называемый так:

getEnumIndex(SampleEnum1.Dos, SampleEnum1.values());
...