Как создать перечисление динамически?
Мне нужно создать перечисление на основе таблицы из базы данных.
Таблица DB MyColors: id/title/value 1/красный/1 2/Зеленый/4
динамическое создание
enum MyColors {
Red=1,
Green=4;
}
Ответы
Ответ 1
Вы можете динамически создавать исходный код, читая из базы данных и просто выводить результаты в формате, способствующем созданию перечисления. Однако создавать время перечисления во время выполнения нецелесообразно. Вам было бы лучше с каким-то ассоциативным массивом.
Ответ 2
Один из вариантов - определить XML-схему и необходимые значения в качестве enum и сгенерировать файлы классов, чтобы мы могли управлять значениями вне исходного кода, однако мы не можем динамически генерировать значения перечисления из базы данных.
Ответ 3
На самом деле существует возможность динамического создания перечислений с использованием отражения: http://niceideas.ch/roller2/badtrash/entry/java_create_enum_instances_dynamically
Ответ 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);
}
}
Вышеупомянутый код может помочь вам.