java 枚举 getter setter

java enum getter setter

我正在使用来自 Web 服务的数据,将把该数据存储到数据容器 classes 中,然后在其他地方获取该数据。

对于特定字段,最合适的数据类型是枚举,因此我创建了以下枚举:

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;
    }
}

此枚举在另一个 class 中使用如下:

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...
}

但这破坏了枚举的唯一目的。

还有如何获取整数形式的事件状态值?

任何人都可以指导我如何继续吗?

在枚举本身中创建一个从值到枚举常量的映射。然后是 static 方法,它采用 int 类型和 returns 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);
    }
}

枚举是 class。它不是 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)。

您可以像这样创建枚举

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)]);

这将return对应序数值的枚举值,例如:-

EventStatus.values[1-1]; //this will return EnumStatus.PENDING

-1 是因为您提供了从 1 开始的序数值。