Динамические Перечисления - ответ на Вашу проблему:
public abstract class DEnum<E extends DEnum<E>> implements Comparable<E>, Serializable {
Этот класс имеет сигнатуру, аналогичную стандартному классу Enum. Он имеет защищенный конструктор, позволяющий создавать экземпляры в конкретных классах Enum. Например:
public class YesNo extends DEnum<YesNo> {
public final static YesNo YES = new YesNo();
public final static YesNo NO = new YesNo();
Класс DEnum знает имена членов посредством самоанализа:
String name = YesNo.YES.getName();
YesNo yes = YesNo.get(YesNo.class, name);
assert (yes == YesNo.YES);
Существует типизированный метод получения, который извлекает все элементы:
YesNo[] items = yes.getItems();
assert (items.length == 2);
Позволяет динамически добавлять элементы во время выполнения с помощью (из базы данных или из файла):
YesNo maybe = getOrCreateIfNotExists(YesNo.class, "MAYBE");
items = yes.getItems();
assert (items.length == 3);
Которые ведут себя так же, как статические члены:
YesNo unknown = YesNo.get(YesNo.class, "MAYBE");
assert (unknown == maybe);