我在年轻职业的形成性项目中就遇到了这个问题。
我采用的方法是在外部保存枚举的值和名称,最终目标是能够编写看起来尽可能接近语言枚举的代码。
我希望我的解决方案如下所示:
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"));
由于我的要求是必须在运行时将成员添加到枚举,所以我还实现了该功能:
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时,在时间压力下,我设计了第一个程序。