【问题标题】:Which is a better practice for if-else condition? [closed]对于 if-else 条件,哪个是更好的做法? [关闭]
【发布时间】:2014-08-11 13:31:35
【问题描述】:

这两个选项哪个更好?

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 进行空检查?第二个选项只执行一次。

【问题讨论】:

  • 见仁见智。就个人而言,需求的复杂性决定了我可以使用哪种风格
  • 第二个对我来说似乎更好,因为它更具可读性并且更易于维护。但正如 MadProgramer 所说,这是见仁见智的问题。
  • 这两个 if-else 语句有不同的行为。当 obj.getType==null 和 obj.getData==null.
  • 好吧,既然第一个没有编译,我会选择第二个...

标签: java if-statement optimization


【解决方案1】:

这两个选项之间存在细微差别。在第一个选项中,无论object.getType 是否为空,都会执行elseif(obj.getData==null) 部分。但是,在第二个选项中,只有object.getType 不为空时才会执行该块。所以,我认为这取决于您的要求。

【讨论】:

  • 不错的 catch +1,是的,这绝对取决于您要完成的工作。
  • 同意。但是,如果我们只考虑性能,哪一个会更好?
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    这取决于你需要什么。

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

    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 然后检查条件是一种相当正常的模式,称为 null 保护。

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

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

    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
    }
    

    【讨论】:

    • 谢谢。但是,如果我们只考虑性能,哪一个会更好?
    • @jdphenix 您的 guardIf() 方法的条件错误。对于第二个和第三个条件,它应该是 x
    • @hk6279 确实,不错的收获:)
    • 抱歉,您的基准测试结果毫无价值。参见例如here。顺便说一句,任何花费不到一秒的 Java 基准测试都是废话(谷歌热身)。
    猜你喜欢
    • 2019-09-12
    • 2012-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-10
    • 1970-01-01
    • 2012-06-02
    • 1970-01-01
    相关资源
    最近更新 更多