java 有没有替代复杂枚举的方法?

2cmtqfgy  于 2023-01-16  发布在  Java
关注(0)|答案(1)|浏览(181)

我的 Boot 应用程序中有一个复杂的enum类,它为不同的系统保存不同的状态值。

package com.foo;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

public enum Status {
    FOO_STATUS("Status1" ,"status_1", "STATUS_1", "stat1"),
    BAR_STATUS("Status2" ,"status_2", "STATUS_2", "stat2" ),
    FOO1_STATUS("Status3" ,"status_3", "STATUS_3", "stat3" ),
    BAR1_STATUS("Status4" ,"status_4", "STATUS_4", "stat4" ),
    ....
    ....
    ....

    private final String system1Status;
    private final String system2Status;
    private final String system3Status;
    private final String system4Status;
    private static Map<String, String> statusMap;

    Status(String system1Status, String system2Status, String system3Status, String system4Status) {
        this.system1Status = system1Status;
        this.system2Status = system2Status;
        this.system3Status = system3Status;
        this.system4Status = system4Status;
    }

    public String getSystem1Status() {
        return system1Status;
    }

    public String getSystem2Status() {
        return system2Status;
    }

    public String getSystem3Status() { 
        return system3Status;
    }

    public String getSystem4Status() {
        return system4Status;
    }

    private static void initializeMapping() {
        statusMap = new HashMap<>();
        for (Status map : Status.values()) {
            statusMap.put(map.getSystem1Status(), map.getSystem2Status());
        }
    }

    public static String getSystem2StatusForSytem1Status(String status) {
        if (statusMap == null) {
            initializeMapping();
        }
        if (statusMap.containsKey(status)) {
            return statusMap.get(status);
        }
        return null;
    }

    public static String getSystem3StatusForSytem1Status(String status) {
        ....
    }

    public static String getSystem4StatusForSytem2Status(String status) {
        ....
    }

    public static String getSystem3StatusForSytem2Status(String status) {
        ....
    }
    
    ....
    
    ....

}

枚举保存了各种系统的状态字符串Map。它还提供了通过提供当前系统状态来获取不同系统状态的方法。
例如:我们可以通过发送系统2状态值来获取系统1状态。
随着枚举变得越来越复杂,是否有替代方法来保存此静态数据?
PS:我知道这可以移动到DB中的引用表,但我正在寻找代码中的任何替代(如从yaml文件加载)。

8aqjt8rx

8aqjt8rx1#

对枚举变得越来越复杂的担忧只有在这种复杂性是偶然的,而不是固有的情况下才是有效的。否则,切换到不同的方法只会将这种复杂性转移到其他地方(在您的示例中似乎就是这种情况)。我认为如果满足以下条件,保留枚举(即使它变得复杂)是有意义的:

  • 在不更改代码的情况下,您希望/需要考虑新状态或新Map(或删除现有状态或Map),这是不合理的。
  • 你至少需要依赖一些现成的枚举特性,所以你必须手工重新实现这些特性。例如,values()以确定的顺序列出,valueOf()用于规范的String标签,ordinal()用于推断位置,compareTo(),name(),序列化等等。
  • 您可以多态地使用枚举常量(并且可能需要在没有完整类层次结构的情况下更改其中一些常量的行为),或者您希望利用编译器检查switch表达式中的穷尽case分支(使用较新的java版本)。

相关问题