Java可折叠if语句

时间:2011-09-28 12:23:01

标签: java if-statement pmd

我使用PMD来检查我的代码。在大多数情况下,它给了我非常有用的提示,但我无法弄清楚在以下场景中可以改进什么。

原始代码如下所示:

if ((getSomething() != null && getSomethingElse() != null)
     || (getSomething() == null && getSomethingElse() == null))
{
   ...
}
PMD告诉我:

  

有时两个'if'语句可以通过分离它们来巩固   具有布尔短路运算符的条件。

为简单起见,我们只使用a和b作为布尔变量。然后这段代码看起来像这样:

if ((!a && !b) || (a && b))

这可以转换为以下之一:

if ((!a || b) && (a || !b))
if (!(a^b))

最后

if (a==b)

所以我将代码简化为

if ((getSomething() == null) == (getSomethingElse() == null))

然而,PMD一直抱怨(实际上关于所有三个版本)。这是误报还是有更好的方法来编写if条件?

3 个答案:

答案 0 :(得分:3)

问题是不同的。 if语句是另一个if中的唯一代码(代码来自验证方法):

if (...)
{
   ...
}
else if (...)
{
   ...
}
else if (...)
{
   if ((getSomething() == null) == (getSomethingElse() == null))
   {
      ...
   }
}

PMD消息的含义是,我可以结合最后一个else-if和内部if子句的条件:

if (...)
{
   ...
}
else if (...)
{
   ...
}
else if (... && ((getSomething() == null) == (getSomethingElse() == null)))
{
      ...
}

但是,我不确定,如果我这样做,因为原始版本似乎更清楚了解。

答案 1 :(得分:2)

if ((a != null) && (b != null) && (a==b))

..虽然亲自,我会在这个if语句之前做空检查,所以我可以单独处理a == null和b == null个案

答案 2 :(得分:1)

问题在于很难解释大块条件。

OTOH,并非所有需要注意PMD排放的警告 - 考虑投资回报率。是否值得重构或重组以使其更清洁?是否可以以不同的方式处理相同的功能?

如果它不值得,请不要打扰。