我有一个服务和该服务的 API。该服务有一个枚举,假设有 20 个值。但我的 API 只有 10 个。我所做的是将 20 个服务枚举映射到 10 个 api 枚举。但是假设有人更改了服务的枚举?有人添加了 10 个值,因此我们现在有 30 个枚举,但忘记/不知道如何更改映射。然后我们有 10 个未映射的枚举永远不会到达客户端。是否可以设计两个枚举之间的映射,以便如果其中任何一个发生更改,那么我们会收到一个编译时错误,表明存在未映射的枚举值?或者我在这里想得很错误?也许单元测试是确保枚举中的所有值都映射到另一个值的方法?
编辑:
服务枚举将具有更具技术性的枚举,而 api 枚举将仅具有更符合逻辑的值?
服务枚举:
- JPA_ERROR(“描述”)
- DATABASE_DOWN
- SOMETHING_INVALID
- SOMETHING_EXPIRED
- SERVICE_UNAVAILABLE
API 枚举:
- SOMETHING_INVALID
- SOMETHING_EXPIRED
- SERVICE_UNAVAILABLE
我今天的映射只是一个函数,它以服务枚举作为参数,并有一个基本的 switch 语句。在默认语句中我返回 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 - 层之间枚举的映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35512107/