【发布时间】:2017-10-12 07:06:18
【问题描述】:
我有一个困扰我一段时间的问题,是关于更可取的流量控制方法。
我经常遇到一种情况,我必须根据 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 {}
}
我知道,应该只在特殊情况下使用异常,但我的情况并不特殊,第二个解决方案对我来说看起来更好,因为我可以添加一些异常处理程序(如在 Spring 中)并将其转换为一些不错的 Http最后的状态码。控制器方法process 没有被几十个空检查污染。
各位聪明人能否请教一下应该使用哪一种解决方案?或者也许还有第三个?
【问题讨论】:
-
请注意,如果您使用的是
if(Optional.isPresent()),那么您只是将null替换为Optional,但不是以任何合理的方式。 -
现在看看你的问题造成的混乱。
-
谢谢大家的意见,现在我确信,我的问题没有单一的答案,可能一切都取决于谁在进行代码审查 :) 我只是想知道是否控制应用程序异常流动总是一种不好的做法,即使有时它看起来更简单、更干净
-
@nibsa 请考虑对您有帮助的回答和评论。也可以考虑选择一个答案。
标签: java exception control-flow