[英]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;
}
在上述情况下,只有一个中断表示所有情况都将执行相同的代码。
上面的场景也可以通过其他方式实现,如下所示
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.