Поиск типов Java Enum из значений кода? - PullRequest
4 голосов
/ 22 февраля 2011

Мы используем значения кода в нашей базе данных и Enums в Java.При запросе к базе данных нам нужно взять значение кода и получить экземпляр Enum.

Неужели иметь HashMap, чтобы избежать итерации?Чтобы ты делал?Есть ли более простой способ?

public enum SomeEnum
{
    TYPE_A(2000), TYPE_B(2001);

    private int codeValue;

    private static HashMap<Integer, SomeEnum> codeValueMap = new HashMap<Integer, SomeEnum>(2);

    static
    {
        for (SomeEnum  type : SomeEnum.values())
        {
            codeValueMap.put(type.codeValue, type);
        }
    }

    //constructor and getCodeValue left out      

    public static SomeEnum getInstanceFromCodeValue(int codeValue)
    {
        return codeValueMap.get(codeValue);
    }
}

Ответы [ 5 ]

4 голосов
/ 22 февраля 2011

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

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

1 голос
/ 22 февраля 2011

Если ваше пространство перечисления плотное, то есть не слишком много неиспользуемых значений, вы можете использовать методы toString () и valueOf (). Назовите свои значения с общим строковым префиксом, затем прикрепите префикс перед использованием valueOf () и удалите его после использования toString (). Это имеет тот недостаток, что вам придется конвертировать в числовое значение, если оно хранится в вашей базе данных.

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

Оба эти метода имеют преимущество в использовании дизайна классов enum.

Существует много полезной, ошеломляющей информации о перечислениях (и Java в целом) на http://mindprod.com/jgloss/enum.html.

Хотя в твоем пути нет ничего плохого, если он делает то, что тебе нужно.

1 голос
/ 22 февраля 2011

Отлично.Не беспокойтесь о крошечных различиях в производительности.

Можно подумать, что если для перечисления есть только два экземпляра, как в вашем примере, тривиальный код итерации будет быстрее:

public static SomeEnum getInstanceFromCodeValue(int codeValue)
{
    for (SomeEnum  type : SomeEnum.values()) {
        if(type.codeValue == codeValue)
            return type;
    }
}

Но есть скрытая стоимость, довольно дорогая, если мы заботимся о производительности на таком уровне.Это поправимо, но сначала нужно это увидеть:)

1 голос
/ 22 февраля 2011

Я думаю, что в этом случае мы не можем избежать итерации. Либо это делает HashMap, либо мы написали собственный итерационный код. Если производительность действительно имеет значение, возможно, вы можете попробовать подход бинарного дерева.

1 голос
/ 22 февраля 2011

Спасибо, я думаю, моя главная проблема - использование памяти, и если оно того стоит.

Если у enum нет тысяч значений, использование памяти будет тривиальным.(И если он имеет тысячи значений, то использование итерации для поиска будет основным фактором снижения производительности.)

Это разумное использование памяти, IMO.

Возможно, я слишком обдумал это.

Возможно, вы есть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...