Я столкнулся с этой проблемой на формирующем проекте моей молодой карьеры .
Подход, который я выбрал, состоял в том, чтобы сохранять значения и имена перечисления извне, и конечная цель состояла в том, чтобы иметь возможность писать код, который выглядел как можно ближе к перечислению языка.
Я хотел, чтобы мое решение выглядело так:
enum HatType
{
BASEBALL,
BRIMLESS,
INDIANA_JONES
}
HatType mine = HatType.BASEBALL;
// prints "BASEBALL"
System.out.println(mine.toString());
// prints true
System.out.println(mine.equals(HatType.BASEBALL));
И у меня получилось что-то вроде этого:
// in a file somewhere:
// 1 --> BASEBALL
// 2 --> BRIMLESS
// 3 --> INDIANA_JONES
HatDynamicEnum hats = HatEnumRepository.retrieve();
HatEnumValue mine = hats.valueOf("BASEBALL");
// prints "BASEBALL"
System.out.println(mine.toString());
// prints true
System.out.println(mine.equals(hats.valueOf("BASEBALL"));
Поскольку мои требования заключались в том, что должна быть возможность добавлять члены в enum во время выполнения, я также реализовал эту функциональность:
hats.addEnum("BATTING_PRACTICE");
HatEnumRepository.storeEnum(hats);
hats = HatEnumRepository.retrieve();
HatEnumValue justArrived = hats.valueOf("BATTING_PRACTICE");
// file now reads:
// 1 --> BASEBALL
// 2 --> BRIMLESS
// 3 --> INDIANA_JONES
// 4 --> BATTING_PRACTICE
Я назвал его «шаблоном» динамического перечисления, и вы прочитали о оригинальном дизайне и его пересмотренном издании .
Разница между ними состоит в том, что пересмотренное издание было разработано после того, как я действительно начал впадать в OO и DDD. Первый, который я разработал, когда я все еще писал формально процедурный DDD, под давлением времени не меньше.