Хранение и получение перечислений в SQLite с Java - PullRequest
11 голосов
/ 24 ноября 2011

Мне нужна возможность сохранять и извлекать перечисления из базы данных SQLite, что я решил с помощью комбинированного использования класса-оболочки и перечислений, но я чувствую, что он очень плохо спроектирован.

Каждый раз, когда я хочу добавить новый элемент в список перечислений, я должен добавить его в трех разных местах.

Перечисление должно содержать:

  • целое число (или строка) для его представления
  • текстовая строка, дающая дополнительный текст о самом перечислении
  • способ как-то восстановить его состояние из базы данных

В настоящее время это реализовано так:

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!";
        }
    }
}

Есть ли лучший способ справиться с этим?

Ответы [ 2 ]

21 голосов
/ 24 ноября 2011

Значение перечисления имеет FOO.ordinal() Функция представляет собой числовое представление значения. Функция возвращает свой номер от нуля до n-1, где n - сколько у вас значений перечисления. Затем вы можете использовать types.values()[i], чтобы получить значение по номеру. Но вы должны иметь в виду, что нельзя менять порядок или добавлять новые перечисления в середине, потому что цифры будут изменены.

Также вы можете использовать types.valueOf("FOO") и FOO.name() для строкового представления значения перечисления. Его безопаснее использовать, поскольку он не зависит от порядка объявления.

6 голосов
/ 24 ноября 2011

Вы можете использовать имя перечисления для хранения и извлечения.

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;
}

Если это критично для производительности, вы можете поместить все типы в статическую карту с ключом 'value'.Тогда вам не нужен цикл и произнесите только valueMap.get(value).Карта должна быть инициализирована в статическом блоке в перечислении.

Для дополнительного текстового значения вы можете присвоить перечислению вторую переменную-член типа String с геттером.Таким образом, связанные значения int и String находятся только в инициализации.

Например,

FOO(0,"Hello I'm Foo"),
BAA(1,"Hello I'm Baa"),
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...