我们公司主要以Java开发并支持许多“实时”系统(主要是长期运行的服务器进程),所有这些系统都依赖于共享参考数据和枚举。有时枚举定义会扩展为包含一个新值,在这种情况下,当发生这种情况时,我们当前重新部署所有应用程序,原因是我们的应用程序每个都有一个包含所有库jar的私有“lib”文件夹(包括“枚举实体”库。显然这是不可取的,因此我有兴趣听取其他人的建议或方法。
我想到的想法:
这些方法的问题在于应用程序通常具有以下格式的代码:
switch(enumVal) {
case A:
// Do something.
break;
case B:
// Do something.
break;
default:
throw new IllegalArgumentException("Invalid enum value: " + enumVal);
}
...因此在他们遇到默认情况时会开始失败。也许这表明这些实体根本不应该是枚举;在我们的案例中,这真的是一个方便的权衡。或者它可能只是表明我们的应用程序太脆弱,应该更优雅地处理默认情况。
答案 0 :(得分:1)
先生。史密斯是对的:扩展枚举,或旧学校的“枚举”int常量,很难做到正确,通常不是一个好方法。
正如您所暗示的那样,新的枚举值需要使用它们的客户端进行特殊的行为/处理。修改枚举后,您也必须修改客户端。这真的很糟糕,你应该尝试以另一种方式重新设计它。
答案 1 :(得分:1)
面向对象是专门为解决这个问题而发明的:你的交换机实际上只是一个显式的虚拟表,而隐式的表会好得多。您应该考虑重新设计应用程序以使用接口/基类而不是枚举。
这将问题转移到对象创建时间,这为每个枚举提供了单个更改点的直接优势。 In还为引入基于插件的体系结构开辟了道路,这种体系结构可能不需要任何重新编译,甚至可以在不重新启动的情况下扩展应用程序。鉴于您谈到长时间运行的服务器进程,减少停机时间可能会很有吸引力。
避免重新编译的最简单方法可能是采用Dependency Injection。使用Spring之类的框架,您可以拥有一个或多个配置文件,您可以在其中指定需要创建的对象,然后可以按名称加载它们。