Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 具有应映射到枚举类型的整数值的开关大小写_Java_Enums_Switch Statement - Fatal编程技术网

Java 具有应映射到枚举类型的整数值的开关大小写

Java 具有应映射到枚举类型的整数值的开关大小写,java,enums,switch-statement,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),

嗯。。在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;}
}
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;
        }
 }
您可以看到,当服务器给我一个数字响应时,问题出现了,我无法直接与enum类进行比较。然后,我的想法是创建numCode()方法,该方法将返回实例化枚举的integer属性。我试着这样做:

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;}
}
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;
        }
 }
但正如你所能想象的那样,以上这些都不起作用。第一个案例比较抱怨“案例表达式必须是常量表达式”,而第二个类型只是给了我一个类型不匹配错误

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

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;}
}
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语句,这就是枚举类型的全部用途,好吗??那么,请问,我在这里错过了什么

谢谢


Nelson

枚举中缺少将整数映射到枚举值的方法。具体怎么做取决于你-如果你的整数从0开始是连续的,你可能会使用一个数组。。。或者您可以使用
地图
。无论哪种方式,您都可以执行以下操作:

// 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:
    ...
}

首先创建一个表示数字的枚举,然后创建一个整数/枚举的映射(或数组),然后使用枚举作为开关大小写,这样做有什么好处

这些号码不能直接用于开关箱。如果数字文档/理解是一个问题,请定义数字常量


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

看一看,它是针对具有字符串值的枚举,但很容易转换为int.Cool。。这正是我想要的。谢谢ServerResponse ServerResponse=ServerResponse.values()[ServerResponseEnumber]@Jon这不会有帮助吗?@BobbyKumar:如果您希望始终将序号与数值联系起来,那就行了。现在还不清楚这是个好主意。它还需要在每次使用数组时填充它。。。如果要使用序号,我会缓存
值的值,而不是每次都调用它。我有点类似的感觉。但是,当我来自C、C++背景,并用于与整数值对应的枚举时,我才开始像以前那样使用它们。