首页 > 解决方案 > 枚举的设计建议

问题描述

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

我们有一个存储类别的表。例如:用户角色类别、用户状态类别(活动/非活动)等。问题是表的主键是一个序列,用于所有其他表的参考。有时,我需要为枚举值提供 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 是不同的。这就是让我将设置器添加到枚举的原因。

标签: java

解决方案


引用不应按 id 而是按代码。

当然应该使用硬编码的 id 常量(检查一下)。

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

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

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

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

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

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


推荐阅读