Java Enum的设计建议

Java Enum的设计建议,java,Java,我有一个遗留应用程序正在迁移到微服务中。到目前为止,数据库是共享的 我们有一个存储类别的表。例如:用户角色类别、用户状态类别(活动/非活动)等。 问题在于该表的主键是一个序列,它是所有其他表中用于引用的内容。 有时,我需要提供枚举值的id/根据给定的id查找枚举值 public enum UserRole implements Domain { GUEST ("Guest"), ADMIN ("Admin"); private static final Map<

我有一个遗留应用程序正在迁移到微服务中。到目前为止,数据库是共享的

我们有一个存储类别的表。例如:用户角色类别、用户状态类别(活动/非活动)等。 问题在于该表的主键是一个序列,它是所有其他表中用于引用的内容。 有时,我需要提供枚举值的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);
    }

}
公共枚举用户角色实现域{
客人(“客人”),
管理员(“管理员”);
私有静态最终映射按_CODE=new HashMap();
私有静态最终映射由_ID=new HashMap()生成;
静止的{
Arrays.stream(values())
.forEach(ur->BY_CODE.put(ur.getCode(),ur));
}
私人长id;
私有字符串码;
用户角色(字符串代码){
this.code=代码;
}
@凌驾
公共长getId(){
返回id;
}
@凌驾
公共字符串getCode(){
返回码;
}
@凌驾
公共无效集合id(长id){
this.id=id;
按ID.put(ID,this);
}
公共静态用户角色fromCode(字符串代码){
按代码返回。获取(代码);
}
公共静态用户角色fromId(长id){
通过_ID.get(ID)返回;
}
}
目前,我在启动期间加载带有代码和id的枚举。这真的是个好设计吗?我有些不喜欢这个实现。我也没有其他的想法。我还有20个不同的类别(20个枚举)。我不想重复代码



像“Guest”这样的代码值对于所有环境都是相同的。但是对于每个环境(如dev、qa、stg和prod),相应的id是不同的。这就是为什么我将setter添加到enum中的原因。

引用不应该按id,而应该按代码

当然,应该使用硬编码的id常量(请检查)

这简化了许多查询,删除了与最终枚举表的连接

人们甚至可能会想到SQL列枚举而不是引用

枚举表将变得无用。枚举类本身不是

这是一个简化的重新设计,带来了可衡量的改进。 这可以逐步完成

要求域是封闭的,域值是固定的(因此是枚举)

如果您仍然希望拥有枚举类:不要使用枚举,而是使用您自己的实体。
然后,您可以使用普通的db表存储库,拥有所有值的列表。您可能会遇到一些硬编码常量:
@UserInRole(“Admin”)…
但是您可以添加和删除值。

您能从其中一个表中摘录一段吗?我真的不明白为什么你要做你所做的事情。理想情况下,枚举应该是常量,而不是setters。是的,枚举包含可变状态的想法非常可疑。例如,请记住,当您序列化枚举实例时,这种状态将丢失。@cricket_007,您是对的。像“Guest”这样的代码值对于所有环境都是相同的。但是对于每个环境,如dev、qa、stg和prod,相应的id是不同的。这就是为什么我要将setter添加到枚举中。为什么不为id->constant单独设置一个映射,而不是枚举本身的一部分呢?在每个环境中,您可以随时加载该贴图。无需将其保存在枚举中-它是运行环境的函数,而不是常量本身固有的东西。