【发布时间】:2011-10-28 08:30:50
【问题描述】:
我们公司主要使用 Java 开发并支持许多“实时”系统(主要是长时间运行的服务器进程),所有这些都依赖于共享参考数据和枚举。有时枚举定义会扩展为包含一个新值,在这种情况下,我们当前重新部署所有应用程序,当这种情况发生时,原因是我们的应用程序每个都有一个包含所有库 jar 的私有“lib”文件夹(包括“枚举实体”库)。显然这是不可取的,所以我很想听听其他人的建议或方法。
我的想法:
- 修改每个应用程序的启动脚本以派生最新的“枚举实体”库版本并将 jar 文件添加到类路径。
- 在运行时动态类加载新枚举定义的某种机制。
这些方法的问题在于应用程序通常具有以下格式的代码:
switch(enumVal) {
case A:
// Do something.
break;
case B:
// Do something.
break;
default:
throw new IllegalArgumentException("Invalid enum value: " + enumVal);
}
... 因此当他们遇到默认情况时将开始失败。也许这表明这些实体根本不应该是枚举;在我们的案例中,这确实是一种方便的权衡。或者它只是表明我们的应用太脆弱了,应该更优雅地处理默认情况。
【问题讨论】:
-
我认为你必须重新考虑你的应用程序设计。请记住:封装变化的内容。
-
当枚举定义扩展时,您的所有应用程序是否立即开始使用新值?你用这些枚举做什么?如果您向枚举添加新值,但未在应用程序代码中的任何位置引用它,它是否仍被应用程序使用(例如通过使用 valueOf())?
-
枚举是编译时常量。所以重启是不够的。如果您更改枚举中的任何内容,则必须重新编译所有使用它们的类。
-
@Udo Fholl:不完全正确,因为 Java 在运行时执行(后期)绑定并且仅按名称执行。如果只向任何类文件(的可见界面)添加新元素,则无需重新编译现有代码。
标签: java enums enumeration