在多应用程序环境中处理枚举

时间:2011-10-28 08:30:51

标签: java enums enumeration

我们公司主要以Java开发并支持许多“实时”系统(主要是长期运行的服务器进程),所有这些系统都依赖于共享参考数据和枚举。有时枚举定义会扩展为包含一个新值,在这种情况下,当发生这种情况时,我们当前重新部署所有应用程序,原因是我们的应用程序每个都有一个包含所有库jar的私有“lib”文件夹(包括“枚举实体”库。显然这是不可取的,因此我有兴趣听取其他人的建议或方法。

我想到的想法:

  1. 修改每个应用程序的启动脚本以派生最新的“枚举实体”库版本,并将jar文件添加到类路径中。
  2. 某种在运行时动态加载新枚举定义的机制。
  3. 这些方法的问题在于应用程序通常具有以下格式的代码:

    switch(enumVal) {
      case A:
        // Do something.
        break;
      case B:
        // Do something.
        break;
      default:
        throw new IllegalArgumentException("Invalid enum value: " + enumVal);
    }
    

    ...因此在他们遇到默认情况时会开始失败。也许这表明这些实体根本不应该是枚举;在我们的案例中,这真的是一个方便的权衡。或者它可能只是表明我们的应用程序太脆弱,应该更优雅地处理默认情况。

2 个答案:

答案 0 :(得分:1)

先生。史密斯是对的:扩展枚举,或旧学校的“枚举”int常量,很难做到正确,通常不是一个好方法。
正如您所暗示的那样,新的枚举值需要使用它们的客户端进行特殊的行为/处理。修改枚举后,您也必须修改客户端。这真的很糟糕,你应该尝试以另一种方式重新设计它。

答案 1 :(得分:1)

面向对象是专门为解决这个问题而发明的:你的交换机实际上只是一个显式的虚拟表,而隐式的表会好得多。您应该考虑重新设计应用程序以使用接口/基类而不是枚举。

这将问题转移到对象创建时间,这为每个枚举提供了单个更改点的直接优势。 In还为引入基于插件的体系结构开辟了道路,这种体系结构可能不需要任何重新编译,甚至可以在不重新启动的情况下扩展应用程序。鉴于您谈到长时间运行的服务器进程,减少停机时间可能会很有吸引力。

避免重新编译的最简单方法可能是采用Dependency Injection。使用Spring之类的框架,您可以拥有一个或多个配置文件,您可以在其中指定需要创建的对象,然后可以按名称加载它们。