我正在使用来自Web服务的数据,将数据存储到数据持有者类中,然后在其他地方获取数据。
对于特定字段,最合适的数据类型是枚举,因此我创建了以下枚举:
public enum EventStatus {
PENDING(1), OPEN(2), DISPATCHED(3), APPENDED(4), CLOSED(5), REQUESTED_TO_CLOSE(
6), ACTION_REQUESTED_FROM_POLICE_STATION(7), ACTION_REQUESTED_FROMD_ISPATCHER(
8), ACTION_REQUESTED_FROM_SUPERVISOR(9);
private int value;
private EventStatus(int value) {
this.value = value;
}
public int getValue() {
return value;
}
//Just for testing from some SO answers, but no use
public void setValue(int value) {
this.value = value;
}
}
此枚举在另一个类中使用如下:
public EventStatus getEventStatus() {
return eventStatus;
}
public void setEventStatus(EventStatus eventStatus) {
this.eventStatus = eventStatus;
}
现在,当我尝试设置如下值时:
event.setEventStatus(getAttributeValueInt(linkedEventElement, "status"));
的等价物
event.setEventStatus(1);
我收到编译错误,方法不适用于参数(int)
我能做到这一点的一种方法是:
switch(getAttributeValueInt(linkedEventElement, "status")){
case 1:eventLinkedEvent.setEventStatus(EventStatus.PENDING);
//and so on...
}
但这破坏了枚举的唯一目的。
如何以整数形式获取事件状态值?
有人可以指导我如何继续吗?
答案 0 :(得分:4)
您可以像这样创建枚举
public enum EventStatus {
PENDING(1), OPEN(2), DISPATCHED(3), APPENDED(4), CLOSED(5), REQUESTED_TO_CLOSE(
6), ACTION_REQUESTED_FROM_POLICE_STATION(7), ACTION_REQUESTED_FROMD_ISPATCHER(
8), ACTION_REQUESTED_FROM_SUPERVISOR(9);
private int value;
private EventStatus(int value) {
this.value = value;
}
public int getValue() {
return value;
}
//Just for testing from some SO answers, but no use
public void setValue(int value) {
this.value = value;
}
public static EventStatus getEventStatusById(int id) {
EventStatus event = null;
switch (id) {
case 1:
event = PENDING;
break;
case 2:
event = OPEN;
break;
case 3:
event = DISPATCHED;
break;
case 4:
event = APPENDED;
break;
case 5:
event = CLOSED;
break;
case 6:
event = REQUESTED_TO_CLOSE;
break;
case 7:
event = ACTION_REQUESTED_FROM_POLICE_STATION;
break;
case 8:
event = ACTION_REQUESTED_FROMD_ISPATCHER;
break;
case 9:
event = ACTION_REQUESTED_FROM_SUPERVISOR;
break;
default:
break;
}
return event;
}
}
您可以在下面的行中尝试设置EventStatus
event.setEventStatus(EventStatus.getEventStatusById(getAttributeValueInt(linkedEventElement, "status")));
我认为它很有用..
答案 1 :(得分:2)
在枚举中创建一个映射,从值到枚举常量。然后是static
方法,它采用int
类型并返回enum
类型。
public enum EventStatus {
// constants
;
private final static Map<Integer, EventStatus> REVERSE_MAP = new HashMap<>();
static {
for (EventStatus status: values()) {
REVERSE_MAP.put(status.value, status);
}
}
public static EventStatus forValue(int value) {
return REVERSE_MAP.get(value);
}
}
答案 2 :(得分:1)
枚举是一个类。它不是int的简单别名,例如在C中。 1是一个整数,而不是EventStatus的一个实例,并且您的方法需要一个EventStatus实例,因此不会编译。
只需在枚举中提供一个工厂方法,将int值转换为枚举:
public static EventStatus fromIntValue(int value) {
// iterate through the enum constants, returned by EventStatus.value(),
// and find the one with the given value
}
您还可以将枚举常量存储在Map<Integer, EventStatus>
中以进行查找O(1)。
答案 3 :(得分:1)
快速解决方案,因为您的序数(枚举索引)与您的值匹配(相差1),修改您的枚举EventStatus
以包含新的EventStatus
数组: -
public enum EventStatus {
PENDING(1), OPEN(2), DISPATCHED(3), APPENDED(4), CLOSED(5), REQUESTED_TO_CLOSE(
6), ACTION_REQUESTED_FROM_POLICE_STATION(7), ACTION_REQUESTED_FROMD_ISPATCHER(
8), ACTION_REQUESTED_FROM_SUPERVISOR(9);
private int value;
public static final EventStatus values[] = values();
private EventStatus(int value) {
this.value = value;
}
public int getValue() {
return value;
}
//Just for testing from some SO answers, but no use
public void setValue(int value) {
this.value = value;
}
}
现在而不是: -
event.setEventStatus(getAttributeValueInt(linkedEventElement, "status"));
使用: -
event.setEventStatus(EventStatus.values[(getAttributeValueInt(linkedEventElement,"status"))-1)]);
这将返回相应序数值的枚举值,例如: -
EventStatus.values[1-1]; //this will return EnumStatus.PENDING
-1
是因为您提供了从1开始的序数值。