Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 消除许多if-else条件的最佳方法是什么?_Java_If Statement_Design Patterns - Fatal编程技术网

Java 消除许多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()) {

我们在数据库中持久化一个对象,但是在需要检查的条件很少之前,我使用if-else来执行这些操作。消除if-else语句的最佳方法是什么。我们还设置了响应对象,它在每个语句中都有一个映射

此外,将来我们必须在创建或更新之前检查其他条件

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:这取决于方法实现。如果私有方法正在修改类变量,则可能会发生并发问题。如果该方法仅处理本地数据,则不会出现并发问题。在所有其他情况下,都需要考虑实际执行情况。