【问题标题】:Switch case with an integer value that should be mapped to an enum type具有应映射到枚举类型的整数值的 switch case
【发布时间】:2023-03-07 16:11:01
【问题描述】:

嗯.. 似乎 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 语句,这就是枚举类型的全部目的,好吗?那么请问,我在这里缺少什么?

谢谢

纳尔逊

【问题讨论】:

标签: java enums switch-statement


【解决方案1】:

您的枚举中缺少一个将整数映射到枚举值的方法。究竟如何做到这一点取决于您 - 如果您的整数从 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:
    ...
}

【讨论】:

  • 酷.. 这正是我想要的。谢谢!
  • ServerResponse serverResponse = ServerResponse.values()[serverResponseNumber] @Jon 这不会有帮助吗?
  • @BobbyKumar:如果您希望始终将序数与数值联系起来,这将起作用。目前尚不清楚这是一个好主意。它还需要在每次使用时填充一个数组...如果您打算使用序数,我会缓存values 的值,而不是每次都调用它。
【解决方案2】:

首先创建一个表示数字的 ENUM,然后创建一个整数/枚举的 MAP(或数组),然后使用枚举是 switch case,它有什么好处?

不能直接在switch case中使用数字。如果数字文档/理解是一个问题,请定义数字常量。

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

【讨论】:

  • 我也有同感。但由于我来自 C、C++ 背景并且习惯于与整数值对应的枚举,所以我刚开始像以前一样使用它们。
猜你喜欢
  • 1970-01-01
  • 2019-04-09
  • 2015-06-27
  • 1970-01-01
  • 2020-08-01
  • 2012-08-03
  • 2018-08-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多