切换具有应映射到枚举类型的整数值的大小写

时间:2011-08-19 05:56:16

标签: java enums switch-statement

嗯..似乎Java中的枚举类比它们的C或C ++反对派更加通用,但对于这个特定的代码构造,我试图设计它们的对象性质只是给我带来麻烦。

我所拥有的是这样的:

public static enum ServerResponse{
    SIGN_UP_SUCESS(0),
    INTERNAL_SERVER_ERROR(1),
    EMAIL_ALREADY_REGISTERED(2),
    SIGNIN_FAILED(3),
    WAITING_CONFIRMATION(4),
    SIGNIN_SUCESS(5),
    BLOCKED_ACCOUNT(6),
    INACTIVE_ACCOUNT(7);

    private final int numcode;
    ServerResponse(int num){
        numcode = num;
    }

    final int numCode(){ return numcode;}
}

您现在看到问题出现了,因为服务器给了我一个数字响应,我无法直接与枚举类进行比较。我的想法是创建numCode()方法,该方法将返回实例化枚举的整数属性。我试着做这样的事情:

int SERVER_RESPONSE = ServerInterface.sendRequest();

switch(SERVER_RESPONSE){
    ServerInterface.ServerResponse.BLOCKED_ACCOUNT.numCode():
        //Do something
    ServerInterface.ServerResponse.INTERNAL_SERVER_ERROR:
}

但是你可以想象以上都没有。第一个案例比较抱怨“案例表达式必须是常量表达式”,第二种类型只是给我一个类型不匹配错误。

那我该怎么做呢?好吧,现在我正在做这样的事情:

 for(ServerResponse response : ServerResponse.values()){
        if(response.numCode() == SERVER_RESPONSE){
               return response;
        }
 }

但它很丑..我想使用一个switch语句,这就是枚举类型的全部目的吗?那么请问,我在这里错过了什么?

由于

纳尔逊

2 个答案:

答案 0 :(得分:7)

你在枚举中缺少一个将整数映射到枚举值的方法。具体如何做到这一点取决于你 - 如果你的整数从0开始是连续的,你可以使用数组......或者你可以使用Map<Integer, ServerResponse>。无论哪种方式,您都可以这样做:

// Please don't use caps for non-constants
int serverResponseNumber = ServerInterface.sendRequest();
ServerResponse serverResponse = ServerResponse.fromInt(serverResponseNumber);

if (serverResponse == null) {
    // Do something with an unknown response - switch will barf otherwise.
    // Possibly throw an exception yourself?
}
switch(serverResponse) {
    case SIGN_UP_SUCCESS:
    ...
}

答案 1 :(得分:2)

首先创建表示数字的ENUM,然后创建整数/枚举的MAP(或数组)然后使用枚举是切换案例会有什么好处?

不能直接在开关盒中使用这些数字。如果编号文档/理解是一个问题,则定义数字常量。

在我看来,这是对我们在这里讨论的内容的误用。