java enum getter setter

时间:2015-04-03 10:13:56

标签: java enums setter getter-setter

我正在使用来自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...
}

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

如何以整数形式获取事件状态值?

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

4 个答案:

答案 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开始的序数值。