Если вы настаиваете на использовании перечисления для этого, вы можете просто использовать существующие средства перечисления. В приведенном ниже решении предполагается, что вместо полей вашего имени и идентификатора могут использоваться имя перечисления и порядковый номер:
public enum Genre {
// ordinal 0, name = "ACTION"
ACTION,
// ordinal 1, name = "HORROR"
HORROR;
}
public static void main(String[] args) {
int horrorOrdinal = 1;
Genre horrorGenre = Genre.values()[horrorOrdinal];
String horrorName = horrorGenre.name();
String actionName = "ACTION";
Genre actionGenre = Genre.valueOf(actionName);
int actionOrdinal = actionGenre.ordinal();
System.out.println(String.format("%s=%s %s=%s", horrorName, horrorOrdinal, actionName, actionOrdinal));
}
Выход:
HORROR=1 ACTION=0
Другим подходящим способом было бы использовать карту для поиска, как предложил Михаил Шрайер:
private static Map<Integer, String> genres = new HashMap<Integer, String>();
public static void main(String[] args) {
initGenres();
int horrorOrdinal = 2;
String horrorName = genres.get(horrorOrdinal);
String actionName = "action";
int actionOrdinal = getGenreIdByName(actionName);
System.out.println(String.format("%s=%s %s=%s", horrorName, horrorOrdinal, actionName, actionOrdinal));
}
private static void initGenres() {
genres.put(1, "action");
genres.put(2, "horror");
}
private static int getGenreIdByName(String genreName) {
for (Entry<Integer, String> entry : genres.entrySet()) {
if (entry.getValue().equals(genreName)) {
return entry.getKey();
}
}
throw new IllegalArgumentException("Genre not found: " + genreName);
}
Выход:
horror=2 action=1
Особенности проектирования:
В этом примере я решил использовать (быстрый) поиск по карте для id-> name и написал отдельный метод (getGenreIdByName) для выполнения обратного поиска name-> id. Вы можете изменить это или использовать вторую карту для ускорения обоих поисков (за счет необходимости поддерживать дополнительную карту).
Я решил сохранить идентификатор и имя на карте. Вы также можете использовать сам класс Genre в качестве значения карты. Это позволит вам позже легко добавить дополнительные поля (например, «описание»).
Если вам нужно представить свои жанры на разных языках, вы можете использовать ResourceBundles для локализации вывода. Создайте языковой файл в корне вашего пути к классам.
В файле genres_nl.properties:
horror=heel eng
action=actie
Где суффикс _nl в имени файла указывает на язык.
Тогда в вашем коде, в initGenres:
ResourceBundle genreNames = ResourceBundle.getBundle("genres", new Locale("nl");
А при получении названия жанра:
String horrorName = genreNames.getString(genres.get(horrorOrdinal));
Обратите внимание, что getString может выдать исключение MissingResourceException во время выполнения, если пакет не найден. Чтобы избежать этого, убедитесь, что вы создали пакет «по умолчанию» без суффикса (так что в этом случае файл с именем «genres.properties») автоматически используется в случае, если не удается найти пакет для используемого языкового стандарта.