Java枚举和Objective-C枚举
我在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){
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;
[...]
}