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

时间:2013-10-25 05:19:31

标签: java switch-statement

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

无故障切换(适用于公共代码)

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;
}

在上面的场景中,只有一个突破意味着所有案例都将执行相同的代码。

每个案例都有休息(对于公共代码)

以上情况也可以通过其他方式实现,如下所示

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;
}

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

4 个答案:

答案 0 :(得分:2)

首先switch block代码更少,更易读。如果出现性能问题,可以忽略不计。

答案 1 :(得分:2)

这会更清楚:

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(); }

}

答案 2 :(得分:2)

如果您使用第二个表单,那么下一个看到此代码的开发人员将花费数小时查看各个行以查看差异。使用第一个表格明确指出“这两个案例之间没有区别”。

这是一个明智的做法。使用第一个表格。

答案 3 :(得分:-1)

Case语句使用fall through模型,这意味着它将在获得真实案例后执行每个案例并执行,直到它不会获得break语句。所以在第一种情况下,假设您发现USER_ACCOUNT_BLOCKED_ALERT为true,那么它也将执行OTP_SEND_SUCCESS和USER_PROFILE_NOT_FOUND情况。

在第二种情况下。如果它发现USER_ACCOUNT_BLOCKED_ALERT为true,那么它将仅执行USER_ACCOUNT_BLOCKED_ALERT块,因为在块结束时它将找到一个中断并且它将退出switch语句。

现在我想你会知道发生了什么。