4

我在 Objective-C 中有以下枚举:

typedef enum {
    APIErrorOne = 1,
    APIErrorTwo,
    APIErrorThree,
    APIErrorFour
} APIErrorCode;

我使用索引来引用 xml 中的枚举,例如,xml可能有error = 2,它映射到APIErrorTwo

我的流程是从 xml 中获取一个整数,然后运行如下 switch 语句:

int errorCode = 3

switch(errorCode){
    case APIErrorOne:
        //
        break;
    [...]
}

似乎Java不喜欢switch语句中的这种枚举:

在此处输入图像描述

在 Java 中,您似乎无法为enum成员分配索引。我怎样才能获得与上述等效的 Java?

4

2 回答 2

6

Java 枚举有一个内置的ordinal,第一个枚举成员为 0,第二个枚举成员为 1,以此类推。

但是枚举是 Java 中的类,因此您也可以为它们分配一个字段:

enum APIErrorCode {
    APIErrorOne(1),
    APIErrorTwo(27),
    APIErrorThree(42),
    APIErrorFour(54);

    private int code;

    private APIErrorCode(int code) {
        this.code = code;
    }

    public int getCode() {
        return this.code;
    }
} 
于 2012-07-11T17:57:11.480 回答
3

每个帖子一个问题是这里的一般规则。

但是不断发展 JB Nizer 的答案。

public enum APIErrorCode {

    APIErrorOne(1),
    APIErrorTwo(27),
    APIErrorThree(42),
    APIErrorFour(54);

    private final int code;

    private APIErrorCode(int code) {
        this.code = code;
    }

    public int getCode() {
        return this.code;
    }

    public static APIErrorCode getAPIErrorCodeByCode(int error) {
       if(Util.errorMap.containsKey(error)) {
         return  Util.errorMap.get(error);
       }
       //Or create some default code
       throw new IllegalStateException("Error code not found, code:" + error);
    }

    //We need a inner class because enum are  initialized even before static block
    private static class Util {

        private static final Map<Integer,APIErrorCode> errorMap = new HashMap<Integer,APIErrorCode>();

        static {

            for(APIErrorCode code : APIErrorCode.values()){
                errorMap.put(code.getCode(), code);
            }
        }

    }
}

然后在你的代码中你可以写

int errorCode = 3

switch(APIErrorCode.getAPIErrorCodeByCode(errorCode){
    case APIErrorOne:
        //
        break;
    [...]
}
于 2012-07-11T18:31:53.693 回答