Java可折叠if语句

Java可折叠if语句,java,if-statement,pmd,Java,If Statement,Pmd,我经常检查我的代码。在大多数情况下,它给了我非常有用的提示,但我不知道在下面的场景中可以改进什么 原始代码如下所示: if ((getSomething() != null && getSomethingElse() != null) || (getSomething() == null && getSomethingElse() == null)) { ... } if ((!a && !b) || (a &&

我经常检查我的代码。在大多数情况下,它给了我非常有用的提示,但我不知道在下面的场景中可以改进什么

原始代码如下所示:

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

有时,两个“如果”语句可以通过分离它们的 具有布尔短路运算符的条件

为了简单起见,我们只使用a和b作为布尔变量。然后这段代码如下所示:

if ((getSomething() != null && getSomethingElse() != null)
     || (getSomething() == null && getSomethingElse() == null))
{
   ...
}
if ((!a && !b) || (a && b))
可以将其转换为以下内容之一:

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

if (a==b)
所以我把代码简化为

if ((getSomething() == null) == (getSomethingElse() == null))
然而,PMD一直在抱怨(事实上,这三个版本都是如此)。这是假阳性还是有更好的方法来记录if条件

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

…虽然就我个人而言,我会在这个if语句之前进行null检查,这样我就可以分别处理a==null和b==null的情况了

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

PMD消息的意思是,我可以组合最后一个else if和内部if子句的条件:

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

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

问题是大量的条件语句很难推理

OTOH,并非PMD发出的每一个警告都需要注意——考虑ROI。是否值得重构或重组以使其更干净?相同的功能能否以不同的方式处理


如果它不值得,不要麻烦。

您确定代码中没有其他If语句吗?PMD抱怨两个if语句,而不是一个比必要的更复杂。我想不出更好的最终版本的方法(这就是我要编写的代码)。
if
块中有什么?在
JSR305
规范中,我刚刚发现了
@javax.annotations.Nonnull
@javax.annotations.Nullable
注释。我使用的实现是
com.Google.code.findbugs:1.3.9
中的Google实现。它极大地清理了我的代码,Intellij IDEA根据这些注释自动生成代码和警告。这是一个关于单独处理
null
案例的好建议。这样,你可以抛出特定的NPE,告诉用户哪一个是
null
,或者以特定的方式处理它们。这不应该是
| |(a==b)
?@Gandalf我不这么认为。。。。由于JRE从左到右处理if语句,查找逻辑上的true或false,因此我发布的if语句的计算结果如下:1)是“a”不是null?对,向右移动。如果为false,则整个计算不能为true,因此停止计算。2) “b”不是空的吗?对,向右移动。如果为false,则整个计算不能为true,因此停止计算。3) 既然我们知道‘a’和‘b’都不是空的,我们就可以安全地计算‘a==b’@claymore1977是的,我理解你的语句以及它的计算方式,但它与原始语句不同。在最初的陈述中,a和b不作相等的比较,如果两者都为空,则原始结果为真。@Gandalf:很好的观点,先生!我对方法学的研究太深入了,失去了意图:)我不认为我会改变我的代码,但发现什么可以“改进”仍然很有趣。总是这样,即使我们听到建议并立即忽略它;)