При работе с переменными / параметрами, которые могут принимать только конечное число значений, я стараюсь всегда использовать 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);
Единственные решения, которые я мог придумать, это:
- Поместите метод поиска в enum, который использует
BonusType.values()
для заполнения карты "int -> enum", затем кэширует его и использует для поиска. Работало бы, но мне пришлось бы копировать этот метод одинаково в каждое перечисление, которое я использую: - (.
- Поместите метод поиска в статический служебный класс. Тогда мне нужен был бы только один метод «поиска», но мне пришлось бы поиграть с отражением, чтобы заставить его работать для произвольного перечисления.
Оба метода кажутся ужасно неловкими для такой простой (?) Проблемы.
Любые другие идеи / идеи?