【问题标题】:Mapping of enum between layers层间枚举的映射
【发布时间】:2016-02-19 18:15:56
【问题描述】:

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

编辑:

服务枚举将具有更具技术性的枚举,而 api-enum 将仅具有应该更合乎逻辑的值?

服务枚举:

  • JPA_ERROR("描述")
  • DATABASE_DOWN
  • SOMETHING_INVALID
  • SOMETHING_EXPIRED
  • SERVICE_UNAVAILABLE

API 枚举:

  • SOMETHING_INVALID
  • SOMETHING_EXPIRED
  • SERVICE_UNAVAILABLE

我今天的映射只是一个将服务枚举作为参数并在其上具有基本开关语句的函数。在默认语句中,我返回 null,这让我很困扰。我不喜欢返回 null 但我也不知道默认语句应该有什么样的行为。这就是为什么我开始考虑是否可以“强制”开发人员始终确保映射正确。

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...
    }    

【问题讨论】:

  • 一个枚举应该代表一组完整的值,在编译时就知道了。如果你认为它会在未来增长,那么它可能不是枚举。
  • 你能举例说明一些枚举值是什么样的吗?
  • 一个枚举应该代表一组固定的值,但我认为它不需要一直固定。 ;) 如果它是真正动态的,就像用户生成的内容通常那样,那么枚举可能不合适。如果它真的是一个固定的集合,可能会在版本或类似的东西之间发生变化,那么枚举对我来说感觉很好。

标签: java enums mapping


【解决方案1】:

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

未映射的枚举异常

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

记录的未映射枚举

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

测试映射

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

【讨论】:

    猜你喜欢
    • 2015-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 2017-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多