2

我使用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 条件?

4

3 回答 3

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)))
{
      ...
}

但是,我不确定是否会这样做,因为原始版本似乎更易于理解。

于 2011-09-28T12:52:23.157 回答
2
if ((a != null) && (b != null) && (a==b))

..虽然就个人而言,我会在此 if 语句之前进行 null 检查,以便我可以单独处理 a == null 和 b == null 情况

于 2011-09-28T12:28:40.027 回答
1

问题是大块的条件句很难推理。

OTOH,并非 PMD 发出的每个警告都需要注意——考虑投资回报率。是否值得重构或重组以使其更清洁?可以用不同的方式处理相同的功能吗?

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

于 2011-09-28T12:55:11.100 回答