繁体   English   中英

当每个case块具有相同的代码时,在switch-case语句中使用什么?

[英]What to use in switch-case statement when every case block has same code?

我有可以通过两种方式完成的代码:

不间断切换(适用于通用代码)

ResultCodes resCode = ResultCodes.fromResponseCode(resultCode);
switch (resCode) {
case SUCCESS:
    if(userIdentity != null)
        Logger.logInfo(MODULE, "User Authenticated Successfully, UseIdentity: " +userIdentity);
    resultMessage=getText(resCode.responseCode.toString());
    RESPONSE = SUCCESS;
    break;
case REDIRECT:
    url = resultMap.get(WebinKeyConstants.REDIRECTION_URL.val);
    Logger.logInfo(MODULE, "Redirecting to URL : " + url);
    resultMessage=getText(resCode.responseCode.toString());         
    RESPONSE = REDIRECT;
    break;
case AUTHENTICATION_FAIL:           
case USER_ACCOUNT_BLOCKED:
case USER_ACCOUNT_INACTIVE:
case USER_ACCOUNT_SUSPENDED:
case USER_ACCOUNT_TERMINATED:
case USER_ACCOUNT_BLOCKED_ALERT:
case OTP_SEND_SUCCESS:
case USER_PROFILE_NOT_FOUND:
         resultMessage=getText(resCode.responseCode.toString());
         RESPONSE = ERROR;
         break;
}

在上述情况下,只有一个中断表示所有情况都将执行相同的代码。

每个案例都带有BREAK(适用于常见情况)

上面的场景也可以通过其他方式实现,如下所示

ResultCodes resCode = ResultCodes.fromResponseCode(resultCode);
switch (resCode) {
case SUCCESS:
    if(userIdentity != null)
        Logger.logInfo(MODULE, "User Authenticated Successfully, UseIdentity: " +userIdentity);
    resultMessage=getText(resCode.responseCode.toString());
    RESPONSE = SUCCESS;
    break;
case REDIRECT:
    url = resultMap.get(WebinKeyConstants.REDIRECTION_URL.val);
    Logger.logInfo(MODULE, "Redirecting to URL : " + url);
    resultMessage=getText(resCode.responseCode.toString());         
    RESPONSE = REDIRECT;
    break;
case AUTHENTICATION_FAIL:           
    resultMessage=getText(resCode.responseCode.toString());
    RESPONSE = ERROR;
    break;
case USER_ACCOUNT_BLOCKED:
    resultMessage=getText(resCode.responseCode.toString());
    RESPONSE = ERROR;
    break;
case USER_ACCOUNT_INACTIVE:
    resultMessage=getText(resCode.responseCode.toString());
    RESPONSE = ERROR;
    break;
case USER_ACCOUNT_SUSPENDED:
    resultMessage=getText(resCode.responseCode.toString());
    RESPONSE = ERROR;
    break;
case USER_ACCOUNT_TERMINATED:
    resultMessage=getText(resCode.responseCode.toString());
    RESPONSE = ERROR;
    break;
case USER_ACCOUNT_BLOCKED_ALERT:
    resultMessage=getText(resCode.responseCode.toString());
    RESPONSE = ERROR;
    break;
case OTP_SEND_SUCCESS:
    resultMessage=getText(resCode.responseCode.toString());
    RESPONSE = ERROR;
    break;
case USER_PROFILE_NOT_FOUND:
    resultMessage=getText(resCode.responseCode.toString());
    RESPONSE = ERROR;
    break;
}

哪个更好用? 有性能问题吗?

第一switch block具有较少的代码,并且更具可读性。 如果出现性能问题,则可以忽略不计。

这将更加清楚:

ResultCodes resCode = ResultCodes.fromResponseCode(resultCode);
if (resCode.isError()) {
     resultMessage = resCode.getResultMessage();
     RESPONSE = ERROR;
}

public enum ResultCodes {

    OK(false), AUTHENTICATION_FAIL(true);

    public final boolean isError;

    ResultCodes(boolean error) { isError = error; }

    public boolean isError() { return isError; }
    public String getResultMessage() { return name(); }

}

如果您使用第二种形式,那么下一个要查看此代码的开发人员将花费数小时来查看各个行,以查看有什么不同。 使用第一种形式明确指出“这两种情况在这里没有区别”。

这很容易。 使用第一种形式。

Case语句使用贯穿模型,这意味着它将在获取到真实的案例后执行所有案例,并执行直到不会收到break语句。 因此,在第一种情况下,假设您发现USER_ACCOUNT_BLOCKED_ALERT情况为true,那么它将同时执行OTP_SEND_SUCCESS和USER_PROFILE_NOT_FOUND情况。

在第二种情况下。 如果它发现USER_ACCOUNT_BLOCKED_ALERT为true,则它将仅执行USER_ACCOUNT_BLOCKED_ALERT块,因为在该块的末尾将找到一个中断,并且将退出switch语句。

现在,我认为您会知道发生了什么。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM