层之间枚举的映射

时间:2016-02-19 18:15:57

标签: java enums mapping

我有这项服务的服务和api。该服务有一个枚举,让我们说20个值。但我的API只有10.我所做的就是将我的20个服务枚举映射到我的10个api-enums。但是,让我们说有人改变服务的枚举?有人添加10个值,所以我们现在有30个枚举,但忘记/不知道如何改变映射。然后我们有10个未映射的枚举,永远不会到达客户端。是否有可能设计两个枚举之间的映射,所以如果它们中的任何一个发生变化,那么我们会得到一个编译时错误,该错误表明存在未映射的枚举值?或者我在这里想错了?也许单元测试是确保枚举中的所有值都映射到另一个的方法吗?

编辑:

服务枚举会有更具技术性的枚举,而api-enums只会有更符合逻辑的值吗?

服务枚举:

  • JPA_ERROR( “描述”)
  • DATABASE_DOWN
  • SOMETHING_INVALID
  • SOMETHING_EXPIRED
  • SERVICE_UNAVAILABLE

API-枚举:

  • SOMETHING_INVALID
  • SOMETHING_EXPIRED
  • SERVICE_UNAVAILABLE

我今天的映射只是一个将service-enum作为参数并在其上有一个基本switch语句的函数。在default-statement中我返回null,这就是让我烦恼的地方。我不喜欢返回null但我也不知道default-statement应该具有什么样的行为。这就是为什么我开始考虑是否可以“强迫”开发人员始终确保映射是正确的。

function ApiEnum mapServiceEnumToApiEnum(ServiceEnum serviceEnum){
    switch(serviceEnum){
        case JPA_ERROR:
             return ApiEnum.SOMETHING_INVALID;
        case DATABASE_DOWN:
             return ApiEnum.SOMETHING_INVALID;
        default:
            return null; //Don't want this to happen...
    }    

1 个答案:

答案 0 :(得分:1)

这是一个抽象的问题 - 我不知道你如何将服务枚举映射到你的枚举,所以很难说最有意义的是什么。但你提到的方法是合理的。

未映射的枚举异常

您当然可以检查枚举是否未映射,然后抛出异常。如果您希望在未映射枚举的情况下请求失败,那么这可能是正确的方法。

记录未映射的枚举

如果您不希望请求失败,您只需要注意何时有未映射的枚举,您可以记录它。当然,这假设您实际上以足够的频率查看日志,以便检测此日志消息。如果没有,记录通常只会产生更多噪音。

测试映射

如果不了解有关架构的更多信息,很难说任何可以根据枚举值检查服务枚举值的测试是否真的是一个单元测试。如果您正在处理远程服务,那么它更多的是集成测试,以及可能由于其他原因而失败的集成测试类型 - 例如测试计算机是否失去与远程服务的连接。不过,这可能是一种比日志消息更容易注意到的方法。