我有一個問題困擾了我一段時間,關於優選的流量控制方法。Java通過拋出異常來控制流量
我經常會遇到的情況,在這裏我不得不決定根據返回值是什麼做的是一個方法null
或not null
所以,我有兩個選擇,我知道如何對付它:
檢查空:
public class BasedOnNullFlowControl {
public String process(String login) {
String redirectUri = getRedirectUri(login);
if (redirectUri != null) {
return redirectUri;
} else {
return "Your login is taken";
}
}
private String getRedirectUri(String login) {
Optional<Login> loginFromDb = checkLoginExists(login);
if (loginFromDb.isPresent()) {
return null;
} else {
return "some-redirect-url";
}
}
private Optional<Login> checkLoginExists(String login) {
return Optional.empty(); //assume this value comes from some API
}
private class Login {}
}
或中斷與異常流量:
public class ExceptionFlowControl {
public String process(String login) {
return getRedirectUri(login);
}
private String getRedirectUri(String login) {
Optional<Login> loginFromDb = checkLoginExists(login);
loginFromDb.ifPresent(l -> {
throw new LoginExistsException();
});
return "some-redirect-url";
}
private Optional<Login> checkLoginExists(String login) {
return Optional.empty();
}
private class LoginExistsException extends RuntimeException {
}
private class Login {}
}
我知道,那例外只能在特殊情況下使用,但我的情況也不例外,仍然第二種方案看起來對我好,因爲我可以添加一些異常處理程序(如在春季),並將其轉化爲一些不錯Http狀態碼到底。控制器方法process
沒有被幾十個空檢查污染。
你能否聰明的人請告知應該使用哪一種解決方案?或者也許還有第三個?
請注意,如果您使用'if(Optional.isPresent())',那麼您只需用'Optional'替換'null',但不能以任何明智的方式。 – Kayaman
現在看看你的問題引起的混亂。 – Kayaman
謝謝大家的意見,現在我相信,我的問題沒有單一的答案,可能一切取決於誰在做代碼審查:)我只是想知道是否通過異常來控制應用程序流總是很糟糕練習,即使有時它看起來更簡單,更清潔的方式 – nibsa