Хранение и извлечение перечислений в 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"),
...