使用Enum类而不是Map来保存常量

时间:2018-02-20 11:42:49

标签: java

我有一个类似下面的地图来保存一些常量值。将值保存在Map中并不是一个好习惯。相反,我可以使用枚举来保存这些值。 但是我对如何为下面的映射创建一个枚举感到有点困惑

//Map to store the events
public static final Map<String, Integer[]> OLYMPICS_SPORT_ID_PARAMS = new HashMap<>();
public static final Map<String, Integer[]> OLYMPICS_EVENT_ID_PARAMS = new HashMap<>();
public static final Map<String, Integer[]> OLYMPICS_PHASE_ID_PARAMS = new HashMap<>();
static {
    OLYMPICS_SPORT_ID_PARAMS.put("sportId", VALID_SPORT_IDS);
    OLYMPICS_EVENT_ID_PARAMS.put("n_EventID", VALID_EVENT_IDS);
    OLYMPICS_PHASE_ID_PARAMS.put("n_EventPhaseID", VALID_EVENT_PHASE_IDS);
}

public static final Map<String, Map<String, Integer[]>> OLYMPICS_EVENTS_MAP = new HashMap<>();
static {
    OLYMPICS_EVENTS_MAP.put("sportId", OLYMPICS_SPORT_ID_PARAMS);
    OLYMPICS_EVENTS_MAP.put("eventId", OLYMPICS_EVENT_ID_PARAMS);
    OLYMPICS_EVENTS_MAP.put("eventPhaseId", OLYMPICS_PHASE_ID_PARAMS);
}

是否有任何想法创建一个ENUM类来映射OLYMPICS_EVENTS_MAP?

4 个答案:

答案 0 :(得分:2)

您可以像这样定义

enum IdParams {
    OLYMPICS_SPORT_ID_PARAMS(VALID_SPORT_IDS),
    OLYMPICS_EVENT_ID_PARAMS(VALID_EVENT_IDS),
    OLYMPICS_PHASE_ID_PARAMS(VALID_EVENT_PHASE_IDS);

    private Integer[] params;
    private IdParams(Integer[] p) {
        params = p;
    }
    public Integer[] getParameters() {
        return params;
    }
}

请注意,数组是一个非常危险的东西,但是这样的话。客户端类将能够操纵各个值。我建议您将其设为List<Integer>并返回不可修改的版本:

    List<Integer> params; 
    // ...
    private IdParams(Integer[] p) {
        params = new ArrayList<>(Arrays.asList(p));
    }
    public List<Integer> getParamters() {
        return Collections.unmodifiableList(params);
    }

答案 1 :(得分:2)

您可以使用ENUM类来存储常量,方法是使用body为ENUM创建构造函数和getter。像这样:

public enum MyEnum {

    FIRST("1", "my first"),
    SECOND("2", "my second"),
    THIRD("3", "my third");

    private final String value;
    private final String description;

    MyEnum(String value, String description) {
        this.value = value;
        this.description = description;
    }

    public String getValue() {
        return value;
    }

    public String getDescription() {
        return description;
    }
}  

使用以下代码访问您的价值或说明:MyEnum.FIRST.getValue();

答案 2 :(得分:1)

替换初始实现的第一个选项是使用枚举映射java.util.EnumMap<K, V>,它知道枚举类型。

但是,如果您需要为此使用枚举,则记录ID和int数组的有效枚举可能如下所示:

enum OlympicEvents {
    OLYMPICS_EVENTS_MAP("sportId", new Integer[] { 1, 2, 3 }), 
    OLYMPICS_EVENT_ID_PARAMS("eventId", new Integer[] { 1, 2, 3 }), 
    OLYMPICS_PHASE_ID_PARAMS("eventPhaseId", new Integer[] { 1, 2, 3 });


    private String eventId;

    private Integer[] eventParams;

    private OlympicEvents (String eventId, Integer[] eventParams) {

        this.eventId = eventId;
        this.eventParams = eventParams;
    }

    public String getEventId() {

        return eventId;
    }

    public Integer[] getEventParams() {

        return eventParams;
    }
}

答案 3 :(得分:1)

在我的HO中,通常你想写下这样的陈述:

OlimpicSportEvent olSpEv = new OlimpicSportEvent(
                Sport.ATHLETIC, Event.SPRINT_100_M, Phase.SEMIFINAL);

为了能够这样做,您必须确保Event.SPRINT_100_M Phase.SEMIFINAL AND Sport.ATHLETIC拥有Event.SPRINT_100_M

我不会在这里写完整个代码,但我会尝试解释我的方法。 首先,您应该编写不仅一个,而是三个枚举。我希望代码能告诉你的不仅仅是文字。 E.g。

public enum Sport {
    ATHLETIC    (0,
                Arrays.asList(  Event.SPRINT_100_M,
                                Event.MARATHON)
                ),
    //...
    SOCCER      (109,
                Arrays.asList(  Event.TEAM_MATCH)
                );

    private final int id;
    private final List<Event> events;

    Sport(int id, List<Event> events){
        this.id = id;
        this.events = events;
    }

    public int getId(){
        return id;
    }

    protected List<Event> getEvents(){
        return this.events;
    }

}

enum Event {
    SPRINT_100_M, // similar to enum Sport, params goes here
    //...
    TEAM_MATCH,
    MARATHON;
}

enum Phase {
    FIRST_ROUND, // params goes here
    //...
    SEMIFINAL,
    FINAL
}

如你所见,我只写了enum Sport到最后。 现在,我写了这样的“测试”示例(请注意,必须实现验证方法以满足您的请求,并且必须编写{{1的完整代码}和Event枚举......

Phase
相关问题