Как создать перечисление динамически?

Мне нужно создать перечисление на основе таблицы из базы данных.

Таблица DB MyColors: id/title/value   1/красный/1   2/Зеленый/4

динамическое создание

enum MyColors {
    Red=1,
    Green=4;
}

Ответы

Ответ 1

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

Ответ 2

Один из вариантов - определить XML-схему и необходимые значения в качестве enum и сгенерировать файлы классов, чтобы мы могли управлять значениями вне исходного кода, однако мы не можем динамически генерировать значения перечисления из базы данных.

Ответ 4

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

Так почему бы не сопоставить таблицу с объектом ColorEntity с помощью JPA? Затем вы можете иметь список или карту этих объектов или что вам нужно.

Ответ 5

/**
     * Add an enum instance to the enum class given as argument
     * 
     * @param the type of the enum (implicit)
     * @param enumType the class of the enum to be modified
     * @param enumName the name of the new enum instance to be added to the class.
     */
    @SuppressWarnings("unchecked")
    public static <T extends Enum<?>> void addEnum(Class<T> enumType, String enumName) {

        // 0. Sanity checks
        if (!Enum.class.isAssignableFrom(enumType)) {
            throw new RuntimeException("class " + enumType + " is not an instance of Enum");
        }
        // 1. Lookup "$VALUES" holder in enum class and get previous enum instances
        Field valuesField = null;
        Field[] fields = enumType.getDeclaredFields();
        for (Field field : fields) {
            if (field.getName().contains("$VALUES")) {
                valuesField = field;
                break;
            }
        }
        AccessibleObject.setAccessible(new Field[] { valuesField }, true);

        try {

            // 2. Copy it 
            T[] previousValues = (T[]) valuesField.get(enumType);
            List values = new ArrayList(Arrays.asList(previousValues));

            // 3. build new enum
            T newValue = (T) makeEnum(enumType, // The target enum class 
                    enumName, // THE NEW ENUM INSTANCE TO BE DYNAMICALLY ADDED 
                    values.size(),
                    new Class<><[] {}, // can be used to pass values to the enum constuctor
                    new Object[] {}); // can be used to pass values to the enum constuctor

            // 4. add new value
            values.add(newValue);

            // 5. Set new values field
            setFailsafeFieldValue(valuesField, null, 
                    values.toArray((T[]) Array.newInstance(enumType, 0)));

            // 6. Clean enum cache
            cleanEnumCache(enumType);

        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e.getMessage(), e);
        }
    }

Вышеупомянутый код может помочь вам.