我使用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条件?
答案 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排放的警告 - 考虑投资回报率。是否值得重构或重组以使其更清洁?是否可以以不同的方式处理相同的功能?如果它不值得,请不要打扰。