Хранение и извлечение перечислений в SQLite с Java
Мне нужно сохранять и извлекать перечисления из базы данных SQLite, которые я решил с помощью совместного использования класса оболочки и перечисления, но я чувствую, что он очень плохо разработан.
Каждый раз, когда я хочу добавить новый элемент в список перечислений, я должен добавить его в три разных места.
Перечисление должно содержать:
- int (или строка) для его представления
- текстовая строка, дающая дополнительный текст о самом enum
- метод для восстановления состояния из базы данных
В настоящее время он выполняется следующим образом:
public class items
{
public enum types {
FOO(0),
BAR(1),
BAZ(2);
private final int _value;
types(int value){_value = value;}
public int value(){return _value;}
}
public static types Get(int i)
{
switch(i)
{
case 0:
return types.FOO;
case 1:
return types.BAR;
case 2:
return types.BAZ;
default:
return null;
}
}
public static String Get(Typer type)
{
switch(type)
{
case FOO:
return "This is foo!";
case BAR:
return "This is bar!";
case BAZ:
return "This is baz!";
default:
return "No good!";
}
}
}
Есть ли лучший способ справиться с этим?
Ответы
Ответ 1
Значение перечисления имеет FOO.ordinal()
function - числовое представление значения. Функция возвращает свое число между нулем и n-1
, где n
- сколько значений перечисления у вас есть. Затем вы можете использовать types.values()[i]
для возврата значения по числу. Но вы должны иметь в виду, что ему не разрешено изменять порядок или добавлять новое перечисление посередине, потому что числа будут изменены.
Кроме того, вы можете использовать types.valueOf("FOO")
и FOO.name()
для строкового представления значения перечисления. Это безопаснее использовать, потому что это не зависит от порядка объявления.
Ответ 2
Вы можете использовать имя перечисления для хранения и извлечения.
types.valueOf("FOO")
должен доставлять types.FOO
, а types.FOO.name()
- имя переименования.
Если вы хотите получить его переменной-членом, вы можете сделать что-то вроде этого:
public static Types byValue(final int value) {
Types returnvalue = FOO; // default returnvalue
for (final Types type : Types.values()) {
if (type.value == value) {
returnvalue = type;
break;
}
}
return returnvalue;
}
Если это критическая производительность, вы можете поместить все типы в статическую карту с ключом "значение". Тогда вам не нужен цикл и скажите только valueMap.get(value)
. Карта должна быть инициализирована в статическом блоке в перечислении.
Для дополнительного текстового значения вы можете указать перечисление второй переменной-члена типа String с геттером. Поэтому связанные значения int и String находятся только в инициализации.
Например,
FOO(0,"Hello I'm Foo"),
BAA(1,"Hello I'm Baa"),
...