Проверьте, существует ли перечисление в Java

Решение, которое сработало для меня ниже:

Use your_database_name;
SOURCE path_to_db_sql_file_on_your_local;
55
задан bluish 1 December 2011 в 16:40
поделиться

3 ответа

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

public static MyEnum asMyEnum(String str) {
    for (MyEnum me : MyEnum.values()) {
        if (me.name().equalsIgnoreCase(str))
            return me;
    }
    return null;
}

Изменить: Как отмечает Джон Скит, values ​​() работает путем клонирования частного резервного массива каждый раз, когда он вызывается. Если производительность критична, вы можете вызвать values ​​() только один раз, кэшировать массив и перебирать его.

Кроме того, если ваше перечисление имеет огромное количество значений, можно использовать альтернативу карты Джона Скита. вероятно, будет работать лучше, чем любая итерация массива.

47
ответ дан 26 November 2019 в 17:40
поделиться

Если мне нужно это сделать, Иногда я создаю Set имен или даже свою собственную Map - тогда вы можете просто проверить это.

Пара очков стоит примечание:

  • Заполните любую такую ​​статическую коллекцию в статическом инициализаторе. Не используйте инициализатор переменной, а затем полагайтесь на его выполнение при запуске конструктора перечисления - этого не было! (Конструкторы перечисления - это первое, что выполняется перед статическим инициализатором.)
  • Старайтесь избегать частого использования values ​​() - он должен каждый раз создавать и заполнять новый массив. Чтобы перебрать все элементы, используйте EnumSet. allOf , что намного эффективнее для перечислений без большого количества элементов.

Пример кода:

import java.util.*;

enum SampleEnum {
    Foo,
    Bar;

    private static final Map<String, SampleEnum> nameToValueMap =
        new HashMap<String, SampleEnum>();

    static {
        for (SampleEnum value : EnumSet.allOf(SampleEnum.class)) {
            nameToValueMap.put(value.name(), value);
        }
    }

    public static SampleEnum forName(String name) {
        return nameToValueMap.get(name);
    }
}

public class Test {
    public static void main(String [] args)
        throws Exception { // Just for simplicity!
        System.out.println(SampleEnum.forName("Foo"));
        System.out.println(SampleEnum.forName("Bar"));
        System.out.println(SampleEnum.forName("Baz"));
    }
}

Конечно, если у вас всего несколько имен, это, вероятно, излишек - решение O (n) часто выигрывает над решением O (1), когда n достаточно мало. Вот другой подход:

import java.util.*;

enum SampleEnum {
    Foo,
    Bar;

    // We know we'll never mutate this, so we can keep
    // a local copy.
    private static final SampleEnum[] copyOfValues = values();

    public static SampleEnum forName(String name) {
        for (SampleEnum value : copyOfValues) {
            if (value.name().equals(name)) {
                return value;
            }
        }
        return null;
    }
}

public class Test {
    public static void main(String [] args)
        throws Exception { // Just for simplicity!
        System.out.println(SampleEnum.forName("Foo"));
        System.out.println(SampleEnum.forName("Bar"));
        System.out.println(SampleEnum.forName("Baz"));
    }
}
62
ответ дан 26 November 2019 в 17:40
поделиться

Я не знаю, почему кто-то сказал вам, что перехват исключений времени выполнения - это плохо.

Используйте valueOf и перехват IllegalArgumentException отлично подходит для преобразования / проверка строки на перечисление.

6
ответ дан 26 November 2019 в 17:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: