Java 消除许多if-else条件的最佳方法是什么?
我们在数据库中持久化一个对象,但是在需要检查的条件很少之前,我使用if-else来执行这些操作。消除if-else语句的最佳方法是什么。我们还设置了响应对象,它在每个语句中都有一个映射 此外,将来我们必须在创建或更新之前检查其他条件Java 消除许多if-else条件的最佳方法是什么?,java,if-statement,design-patterns,Java,If Statement,Design Patterns,我们在数据库中持久化一个对象,但是在需要检查的条件很少之前,我使用if-else来执行这些操作。消除if-else语句的最佳方法是什么。我们还设置了响应对象,它在每个语句中都有一个映射 此外,将来我们必须在创建或更新之前检查其他条件 Callable<Response> callableObj = () -> { if(isNew){ if(checkCreatePermission()){ if(checkDuplicate()) {
Callable<Response> callableObj = () -> {
if(isNew){
if(checkCreatePermission()){
if(checkDuplicate()) {
return foundObejct();
} else {
persistNewObject();
}
} else {
throw new Exception();
}
} else {
if(checkUpdatePermission()){
udapteObject();
} else {
throw new Exception();
}
}
};
Callable callableObj=()->{
如果(是新的){
if(checkCreatePermission()){
if(检查复制()){
返回foundObejct();
}否则{
persistenewobject();
}
}否则{
抛出新异常();
}
}否则{
if(checkUpdatePermission()){
udapteObject();
}否则{
抛出新异常();
}
}
};
我建议将其分为几个方法。不确定我是否得到了你需要的东西,但可能是
createOrUpdate(){
if(isNew()){
创建();
}否则{
更新();
}
}
创建(){
if(checkCreatePermission()){
if(检查复制()){
返回foundObejct();
}否则{
persistenewobject();
}
}否则{
抛出新异常();
}
}
更新(){
if(checkCreatePermission()){
udapteObject();
}否则{
抛出新异常();
}
}
您可以使用一些早期返回/抛出。使代码更具可读性
if(isNew){
if(!checkCreatePermission()){
throw new Exception();
}
if (checkDuplicate()) {
return foundObejct();
}
persistNewObject();
} else {
if(!checkUpdatePermission()){
throw new Exception();
}
udapteObject();
}
消除许多if-else条件的最佳方法
改进代码的一种方法是反转if条件,然后将条件代码分解为各自的方法
下面的代码在功能上等同于您编写的代码
public ... originalMethod() {
if(isNew) handleNewObject();
else handleExistingObject();
}
private ... handleExistingObject() {
if (!checkUpdatePermission()) throw new Exception();
updateObject();
}
private ... handleNewObject() {
if (!checkCreatePermission()) throw new Exception();
if (checkDuplicate()) return foundObject();
persistNewObject();
//... other steps.
}
你可以从中获得灵感。在下面的代码中,我假设要运行
Callable
可以调用它的apply()
方法:
Callable<Response> cError = () -> { throw new Exception(); };
Callable<Response> cUpdateObject = () ->
!isNew && checkUpdatePermission() ? updateObject() : cError.apply();
Callable<Response> cPersistNewObject = () ->
isNew && checkCreatePermission() && !checkDuplicate() ? persistNewObject() : cUpdateObject.apply();
Callable<Response> callableObj = () ->
isNew && checkCreatePermission() && checkDuplicate() ? foundObject() : cPersistNewObject.apply();
Callable cError=()->{throw new Exception();};
可调用的cUpdateObject=()->
!isNew&&checkUpdatePermission()?updateObject():cError.apply();
可调用cPersistNewObject=()->
isNew&&checkCreatePermission()&&!checkDuplicate()?persistenewobject():cUpdateObject.apply();
可调用callableObj=()->
isNew&&checkCreatePermission()&&checkDuplicate()?foundObject():cPersistNewObject.apply();
使用这种方法,很容易看到导致每个响应的条件
p/S:如果需要,您可以缓存对
checkCreatePermission()
、checkUpdatePermission()
和checkDuplicate()
的调用。您使用什么版本的Java?我使用Java 8…当isNew为false时,您确定应该调用checkCreatePermission吗?如果同一方法被调用两次,那么您可以移动该部分。很抱歉,这是一个输入错误。它实际上是checkUpdatePermission()。编辑question@displayName对落选或接近票数的选票发表评论往往会导致报复。因此不鼓励这样做。谢谢你的回答。我喜欢这种方法,它更干净。但问题是我使用的是Callable,代码在Callable内部。如果我在callable之外创建私有方法,它会工作吗?我们会有并发问题吗?@user95814:这取决于方法实现。如果私有方法正在修改类变量,则可能会发生并发问题。如果该方法仅处理本地数据,则不会出现并发问题。在所有其他情况下,都需要考虑实际执行情况。