我有一个类似下面的地图来保存一些常量值。将值保存在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?
答案 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