При работе с переменными / параметрами, которые могут принимать только конечное количество значений, я стараюсь всегда использовать Java enum
, как в
public enum BonusType {
MONTHLY, YEARLY, ONE_OFF
}
Пока я остаюсь внутри своего кода, все работает нормально. Однако мне часто нужно взаимодействовать с другим кодом, который использует простые int
(или String
) значения для той же цели, или мне нужно читать / писать из / в базу данных, где данные хранятся в виде числа или строки.
В этом случае я хотел бы иметь удобный способ связать каждое значение перечисления с целым числом, чтобы я мог преобразовывать оба способа (другими словами, мне нужно «обратимое перечисление»).
Перейти от enum к int очень просто:
public enum BonusType {
public final int id;
BonusType(int id) {
this.id = id;
}
MONTHLY(1), YEARLY(2), ONE_OFF(3);
}
Затем я могу получить доступ к значению int как BonusType x = MONTHLY; int id = x.id;
.
Однако я не вижу хорошего пути для обратного, то есть перехода от int к enum. В идеале что-то вроде
BonusType bt = BonusType.getById(2);
Единственные решения, которые я мог придумать:
- Поместите в перечисление метод поиска, который использует
BonusType.values()
для заполнения карты «int -> enum», затем кэширует его и использует для поиска. Будет работать, но мне придется копировать этот метод идентично в каждое используемое мной перечисление :-(. - Поместите метод поиска в статический служебный класс. Тогда мне понадобится только один метод поиска, но мне придется возиться с отражением, чтобы заставить его работать для произвольного перечисления.
Оба метода кажутся ужасно неудобными для такой простой (?) Задачи.
Любые другие идеи / идеи?
ordinal()
.ordinal()
), или они определяются внешними силами?