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