java - 枚举的设计建议
问题描述
我有一个遗留应用程序正在迁移到微服务中。截至目前,数据库是共享的。
我们有一个存储类别的表。例如:用户角色类别、用户状态类别(活动/非活动)等。问题是表的主键是一个序列,用于所有其他表的参考。有时,我需要为枚举值提供 id/根据给定的 id 查找枚举值。
public enum UserRole implements Domain {
GUEST ("Guest"),
ADMIN ("Admin");
private static final Map<String, BillingMode> BY_CODE = new HashMap<>();
private static final Map<Long, BillingMode> BY_ID = new HashMap<>();
static {
Arrays.stream(values())
.forEach(ur -> BY_CODE.put(ur.getCode(), ur));
}
private long id;
private String code;
UserRole(String code){
this.code = code;
}
@Override
public long getId() {
return id;
}
@Override
public String getCode() {
return code;
}
@Override
public void setId(long id) {
this.id = id;
BY_ID.put(id, this);
}
public static UserRole fromCode(String code){
return BY_CODE.get(code);
}
public static UserRole fromId(long id){
return BY_ID.get(id);
}
}
目前我在启动过程中加载带有代码和 id 的枚举。这真的是一个好的设计吗?我有些不喜欢这个实现。我也没有得到任何其他想法。我还有 20 个不同的类别(20 个枚举)。我不想重复代码。
'Guest' 之类的代码值对于所有环境都是相同的。但是对于每个环境,例如 dev、qa、stg 和 prod,对应的 id 是不同的。这就是让我将设置器添加到枚举的原因。
解决方案
引用不应按 id 而是按代码。
当然应该使用硬编码的 id 常量(检查一下)。
这简化了许多查询,删除了与最终枚举表的连接。
人们甚至可能会想到 SQL 列枚举而不是引用。
枚举表变得无用。枚举类本身不是。
这是一个简化的重新设计,带来了可衡量的改进。它可以逐步完成。
要求是域是封闭的,域值是固定的(因此是枚举)。
如果你仍然想要枚举类:不要使用枚举,而是你自己的实体。然后你可以使用一个普通的数据库表存储库,有一个所有值的列表。您可能会遇到一些硬编码的常量:@UserInRole("Admin") ...
但您可以添加和删除值。
推荐阅读
- r - R 循环制作新向量
- angular - 如何捕捉显示 Angular 动态组件时发生的错误?
- azure - Azure 认知服务自定义愿景:我可以使用 V3.0 API 实现查找相似图像功能吗?
- swift - 为什么 Swift 设计为不允许泛型用于协议?
- javascript - Chainpoint 存在证明
- sql-server - 为一周中的每一天生成记录计数
- javascript - 为茉莉花修改了 JUnit xml 报告器,给出 RangeError:超出了最大调用堆栈大小
- javascript - Readmore.js 实现
- python - 使用 IF 语句的条件相关性 - Python
- javascript - onPress 后视图不重新渲染