【问题标题】:Java if statement with 2 conditions and common code带有2个条件和常用代码的Java if语句
【发布时间】:2015-05-28 06:14:21
【问题描述】:

我有两个条件要检查,如果一个条件为真,我需要执行一些代码,如果另一个条件为真,我需要执行一些不同的代码。但是,如果其中一个为真,除了具体的代码,我还需要执行一段普通的代码。

请注意,两个条件中只有一个可以为真,不能同时为真。

所以,我可以通过 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();

}

方法3

if (condition1){

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

}

else if (condition2){

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

 }

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

方法3我必须复制公共代码。

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

【问题讨论】:

  • 检查一个条件两次并不是一个昂贵的操作。如果涉及任何昂贵的东西,请将结果分配给boolean
  • @n0rd - 哎呀。谢谢,已编辑。如果条件可以为真,则只注意一个,而不是两者。谢谢。
  • Method1 是最优的。正如@RealSkeptic 所提到的,你不能再保存更多的行了,如果检查布尔值也不会那么费力。

标签: java if-statement multiple-conditions


【解决方案1】:

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

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

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

void execCond1AndCond2Stuff() {
  commonCode();
  moreCommonCode();
}

【讨论】:

  • 感谢@tom,这似乎是最好的选择(如果不使用 Method1,这似乎是原始问题中 3 个中最好的)。
  • 这与方法3相同。
  • @CodeWhisperer 并非如此,即使它看起来很相似,想象一下公共代码部分会复杂得多,而不是您的代码重复会显着增加。现在考虑到它不仅仅是一个有趣的项目,你必须测试复制粘贴代码测量语句、分支或其他覆盖范围 - 你必须做两次 - 它不再可维护......
  • 是的,这是我一直在考虑做的事情,并且是方法 3 的扩展,(只是将公共代码放入另一个方法中),我什至希望不必复制方法调用,但是这将减少两次编写代码的次数(代码有几行长)。我猜这或者只是使用原始 Q 中的 option1 是最好的选择。
  • @CodeWhisperer 好的,但我认为这是因为您只看到这两行重复的代码 - 复制两行并不是什么大不了的事,可能没问题,但就像 Zippi 提到的 代码是好几行这只是一个更复杂场景的简化示例,然后你不应该重复代码......
【解决方案2】:
bolean isSet = false;
if (condition1){ 
    specificToCondition1();       
    moreCondition1Stuff();
    isSet = true; 
} else if (condition2){  
    specificToCondition2();        
    moreCondition2Stuff(); 
    isSet = true;
}
if(isSet) {
     commonCode(); 
     moreCommonCode();
 }

【讨论】:

    【解决方案3】:

    您可以根据实际代码的外观使用继承。这是我在想的一个例子。更多样板代码虽然...

    package com.stackoverflow.condition;
    
    public abstract class AbstractCase {
    
        public void doLogic() {
            // Some common logic
            doSpecificLogic();
        }
    
        abstract void doSpecificLogic();
    }
    
    package com.stackoverflow.condition;
    
    public class CaseOne extends AbstractCase {
        @Override
        protected void doSpecificLogic() {
            // Specific logic
        }
    }
    
    package com.stackoverflow.condition;
    
    public class CaseTwo extends AbstractCase {
        @Override
        protected void doSpecificLogic() {
            // Specific logic
        }
    }
    
    package com.stackoverflow.condition;
    
    public class CaseFactory {
    
        public static AbstractCase getCase(boolean caseOne) {
            return caseOne ? new CaseOne() : new CaseTwo();
        }
    }
    
    package com.stackoverflow.condition;
    
    public class Implementation {
    
        public static void main(String... args) {
            CaseFactory.getCase(true).doLogic();
        }
    }
    

    【讨论】:

    • 你不觉得有点过度设计了吗?
    • 至少满足不重复检查或代码重复的标准:D
    • 我认为这段代码试图在笔中添加火箭引擎,同时仍试图保持笔的功能。
    猜你喜欢
    • 2018-04-04
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 2016-10-08
    • 1970-01-01
    • 2019-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多