Java枚举和Objective-C枚举

Java枚举和Objective-C枚举,java,objective-c,enums,Java,Objective C,Enums,我在Objective-C中有以下枚举: typedef enum { APIErrorOne = 1, APIErrorTwo, APIErrorThree, APIErrorFour } APIErrorCode; 我使用索引引用xml中的枚举,例如,xml可能有error=2,它映射到apierrotwo 我的流程是从xml中获取一个整数,并按如下方式运行switch语句: int errorCode = 3 switch(errorCode){

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

typedef enum {
    APIErrorOne = 1,
    APIErrorTwo,
    APIErrorThree,
    APIErrorFour
} APIErrorCode;
我使用索引引用xml中的枚举,例如,
xml
可能有
error=2
,它映射到
apierrotwo

我的流程是从xml中获取一个整数,并按如下方式运行switch语句:

int errorCode = 3

switch(errorCode){
    case APIErrorOne:
        //
        break;
    [...]
}
Java似乎不喜欢switch语句中的这种枚举:


在Java中,似乎无法将索引分配给
enum
成员。如何获得上述Java等效项?

Java枚举有一个内置项,第一个枚举成员为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;
    }
} 

每篇文章一个问题是这里的一般规则

但是,不断演变的答案

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

    }
}

我可以将第一个错误序号设置为1,而不指定其他错误序号吗?就像在Objective-C中一样,索引会层叠吗?@Daniel,不,你不能。如果指定构造函数,则所有枚举项都必须声明它。不,不能。序数总是从0开始。但是您可以添加一个返回ordinal()+1的方法。如何使用此枚举?APIErrorCode(1),APIErrorCode.get(1),APIErrorCode.code(1)?@JBNizet,我认为鼓励程序员使用序号并不是最好的建议。序号用于优化用于替换字节掩码的枚举集。谢谢!您的枚举与前面的答案无关!谢谢你,这是可行的。我得说这太疯狂了,这对Java中的枚举来说太过分了,我最好有几个静态变量…@Daniel,我很高兴你喜欢这个解决方案。但我会选择一个简单的解决方案。在开关中调用
case apierrone.getCode():
。编译器确保您只切换一种类型,因此不可能执行
int e=1切换{case 1:break;case apierrocode:braek;}
。但这不起作用,您和他的示例中的
getCode
都是实例方法。但我刚刚计算出来,我需要做:
case APIResponseErrorType.EMPTY_FIELD.getCode():
=>对不起,这是我的真实代码。很难理解他的解决方案是如何工作的,但现在我明白了。因此,
enum
声明比您的声明短得多。。。我想我还是换成他的吧。谢谢你的解释。@Daniel,你是对的,我已经忘记了我认为
final
可以完成这项工作,但它应该是
const
,这对于Enum是不可接受的。最后,我提供的扩展是解决您问题的方法。
int errorCode = 3

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