对于if-else条件,哪种更好的做法?

时间:2014-08-11 00:40:52

标签: java if-statement optimization

这两个选项中哪一个更好?

if(obj.getType!=null && obj.getData()!=null)
{
  // Do something
}
elseif(obj.getData==null)
{
  // Do other thing
}

*OR*

if(obj.getType!=null)
{  
  if(obj.getData!=null)
  {
    // Do something
  }
  else
 {
   // Do other thing
 }
}

主要的疑点是为什么要以第一种方式对getData进行两次空检查?第二个选项只执行一次。

3 个答案:

答案 0 :(得分:2)

这两个选项略有不同。在第一个选项中,无论elseif(obj.getData==null)是否为空,都将执行object.getType部分。但是,在第二个选项中,仅当object.getType不为空时才会执行该块。所以,我认为这取决于你的要求。

答案 1 :(得分:2)

这取决于你需要什么。

考虑您有一项要求,规定您收集代表大于0的值的2个数据点,并且您必须就是否以及哪些值无效提供反馈。

public Data(int x, int y) 
{
    if (x <= 0 || y <= 0) { 
         throw new IllegalArgumentException("Invalid data provided, got (x: %d, y:%d)", x, y); 
    }
}

请注意,检查null然后检查条件是一种称为空值保护的相当正常的模式。

public void setValue(SomeValue o) { 
    if (o == null || o.Value <= 0) { 
        // code to handle bad value
    }
}

另一方面,如果您有一组需要按顺序检查的条件,并且如果不满足条件则失败,您可以(not recommended)使用链式if s就像你有:

public void someOperation() 
{ 
    if (condition) 
    { 
        if (condition2) 
        {
            if (condition3) 
            { 
                // operation here
            } 
        }
    }
}

请注意,虽然您没有明确提及控制语句以外的其他内容,但如果您的情况类似于前面的示例,我会强烈建议通过反转来重构条件检查,如果检查很复杂,将它们重构为返回boolean的方法。

public void someOperation() 
{ 
    if (!condition) 
    {
        // code to fail out
    }

    if (!condition2) 
    {
        // code to fail out
    }

    if (!complexCondition())
    {
        // code to fail out
    }

    // operation here
}

答案 2 :(得分:2)

在第一个示例中,对于getData的空检查不是总是两次完成。无论如何,只能确保完成。 &&运算符检查左边条件是否为真(if obj.getType != null),并且仅当它是,是否继续检查第二个(if obj.getData() != null)&&||是懒惰的运算符。如果他们在检查第一个条件后可以确定整个布尔语句的值,那么他们就不会继续检查其他语句 - 与&|不同。

除非满足外部条件,否则第二个版本不会检查obj.getData值。如果不是,你永远不会到达第二个街区。