Java 枚举的 getter 和 setter

4

我正在从 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...
}

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

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

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


将setter添加到枚举类型是一个不好的想法,因为枚举类型应该是不可变的。 - ACV
4个回答

8
您可以像这样创建枚举:
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")));

我认为这很有用...


是的,你说得对。我忘记给 getEventStatusById 方法设置静态了,这是我的错误。 - Akash Chavda
你的代码运行良好,但在类似的需求中,如果有100个枚举值,你会怎么做呢?这看起来像是一个很大的switch case。我们可以使用Enum类的values()有效地减少手动工作。请查看下面我的答案以获取更多详细信息 :) - Mustafa sabir

3
在枚举类型本身中创建从值到枚举常量的映射。然后创建一个静态方法,该方法接受一个int类型的参数并返回枚举类型。
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);
    }
}

我该如何设置值呢? - GAMA
@GAMA.. 看起来你有点过于喜欢使用全大写字母了。顺便问一下,现在设置值的问题是什么?只需调用那个static方法并传递int值即可。 - Rohit Jain
使用forValue方法:event.setEventStatus(EventStatus.forValue(getAttributeValueInt(linkedEventElement, "status")));(我假设这是你的问题)。如果您希望快速且具有可扩展性,那么这是最佳答案。 - Guillaume Fouillet

2

枚举是一个类。它不像在C语言中一样只是int的简单别名。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)。

如果 (value == EventStatus.PENDING.getValue()) 返回 EventStatus.PENDING; 否则,如果 (value == EventStatus.OPEN.getValue()) 返回 EventStatus.OPEN; - GAMA
不需要。只需使用循环:for (EventStatus es : EventStatus.value()) { if (es.getValue() == value) { return es; } - JB Nizet

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开始。

"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接