Java 带有 2 个条件和公共代码的 if 语句

Java if statement with 2 conditions and common code

我有两个条件要检查,如果一个条件为真,我需要执行一些代码,如果另一个条件为真,我需要执行一些不同的代码.但是,如果either为真,那么除了具体的代码,我还需要进行一段通用的代码。

注意这两个条件只能有一个为真,不能同时为真。

所以,我可以通过 3 种方式做到这一点:

方法一

if (condition1 || condition2){

    //common code here
    commonCode();
    moreCommonCode();

    //Dig a bit deeper to see which one was true
    if (condition1){

        //Carry out some code here specific to condition1
        specificToCondition1();
        moreCondition1Stuff();

    }

    else {

        //Carry out some code here specific to condition2
        specificToCondition2();
        moreCondition2Stuff();

    }

}

方法二

if (condition1){

   specificToCondition1();
   moreCondition1Stuff();

}

else if (condition2){
    specificToCondition2();
    moreCondition2Stuff();

}

if (condition1 || condition2){

    commonCode();
    moreCommonCode();

}

方法三

if (condition1){

    specificToCondition1();
    moreCondition1Stuff();
    commonCode();
    moreCommonCode();

}

else if (condition2){

    specificToCondition2();
    moreCondition2Stuff();
    commonCode();
    moreCommonCode();

 }

方法一方法二中,我需要检查两次条件

方法 3 中,我必须复制通用代码。

我是否遗漏了什么,有没有办法做到这一点,我不必复制代码或检查两次条件?

方法4(公共部分使用私有方法)

所以除了调用公共方法之外,你没有代码重复。

if (condition1) {
  specificToCondition1();
  moreCondition1Stuff();
  execCond1AndCond2Stuff();
}
else if (condition2) {
  specificToCondition2();
  moreCondition2Stuff();
  execCond1AndCond2Stuff();
}

void execCond1AndCond2Stuff() {
  commonCode();
  moreCommonCode();
}
bolean isSet = false;
if (condition1){ 
    specificToCondition1();       
    moreCondition1Stuff();
    isSet = true; 
} else if (condition2){  
    specificToCondition2();        
    moreCondition2Stuff(); 
    isSet = true;
}
if(isSet) {
     commonCode(); 
     moreCommonCode();
 }

您可以根据实际代码的样子使用继承。这是我的想法的一个例子。不过还有更多样板代码...

package com.Whosebug.condition;

public abstract class AbstractCase {

    public void doLogic() {
        // Some common logic
        doSpecificLogic();
    }

    abstract void doSpecificLogic();
}

package com.Whosebug.condition;

public class CaseOne extends AbstractCase {
    @Override
    protected void doSpecificLogic() {
        // Specific logic
    }
}

package com.Whosebug.condition;

public class CaseTwo extends AbstractCase {
    @Override
    protected void doSpecificLogic() {
        // Specific logic
    }
}

package com.Whosebug.condition;

public class CaseFactory {

    public static AbstractCase getCase(boolean caseOne) {
        return caseOne ? new CaseOne() : new CaseTwo();
    }
}

package com.Whosebug.condition;

public class Implementation {

    public static void main(String... args) {
        CaseFactory.getCase(true).doLogic();
    }
}