Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java枚举getter setter_Java_Enums_Setter_Getter Setter - Fatal编程技术网

java枚举getter setter

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

我正在使用来自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), 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是个坏主意,因为枚举应该是不可变的