java枚举getter setter
我正在使用来自web服务的数据,将这些数据存储到数据持有者类中,然后在其他地方获取这些数据 对于特定字段,最合适的数据类型是enum,因此我创建了以下enum:java枚举getter setter,java,enums,setter,getter-setter,Java,Enums,Setter,Getter Setter,我正在使用来自web服务的数据,将这些数据存储到数据持有者类中,然后在其他地方获取这些数据 对于特定字段,最合适的数据类型是enum,因此我创建了以下enum: public enum EventStatus { PENDING(1), OPEN(2), DISPATCHED(3), APPENDED(4), CLOSED(5), REQUESTED_TO_CLOSE( 6), ACTION_REQUESTED_FROM_POLICE_STATION(7), AC
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...
}
但这破坏了enum的唯一目的
另外,如何以整数形式获取事件状态值
有人能告诉我怎么做吗?在枚举本身中创建一个从值到枚举常量的映射。然后是一个
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);
}
}
公共枚举事件状态{
//常数
;
private final static Map REVERSE_Map=new HashMap();
静止的{
对于(EventStatus状态:values()){
反向映射放置(status.value,status);
}
}
值的公共静态事件状态(int值){
返回反向映射get(值);
}
}
枚举是一个类。它不是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
}
您还可以将枚举常量存储在
映射中以进行O(1)查找。您可以这样创建枚举
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),所以修改您的枚举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开始的序数值。那么如何设置该值?@GAMA。。看起来你有点太喜欢所有的帽子了。。顺便说一句,现在设置值的目的是什么?只需调用传递int
值的static
方法即可。使用forValue方法:event.setEventStatus(EventStatus.forValue(getAttributeValueInt(linkedEventElement,“status”))代码>(我想这是你的问题)。这是最好的答案,如果你想让它快速而健壮地发展。像这样的东西??if(value==EventStatus.PENDING.getValue())返回EventStatus.PENDING;else if(value==EventStatus.OPEN.getValue())返回EventStatus.OPEN;不需要。只需使用循环:for(EventStatus es:EventStatus.value()){if(es.getValue()==value){return es;}
是的,您是对的。我的错误是忘记了将static设置为getEventStatusById方法。您的代码工作正常,但在类似的需求中,例如有100个枚举值,您会怎么做。这看起来像是一个大的切换情况。我们可以使用values()枚举类的
,以有效地减少手动工作。查看下面的答案以了解更多详细信息:)向枚举添加setter是个坏主意,因为枚举应该是不可变的