Java “PMD”的PMD验证;x=“是”;

Java “PMD”的PMD验证;x=“是”;,java,pmd,Java,Pmd,这是我的密码: private void showMessageForInvalid(File aFile) { if (!aFile.exists()) { // show not exists message } else if (!aFile.isDirectory()) { // show not directory message } } 对于第一个if块,我收到PMD警告“避免x!=y else”。我想,这个警告在这种情况下是正确的 if (!aFi

这是我的密码:

private void showMessageForInvalid(File aFile) {
  if (!aFile.exists()) {
     // show not exists message
  } else if (!aFile.isDirectory()) {
     // show not directory message
  }
}
对于第一个if块,我收到PMD警告“避免x!=y else”。我想,这个警告在这种情况下是正确的

if (!aFile.exists()) {
  // do something
} else {
  // do else
}

但在我的情况下,如果使用
else if
语句,则不会这样做
这是PMD错误还是警告正确(在这种情况下我应该如何编写代码)

首先执行现有分支:

if (aFile.exists()) {

   if (aFile.isDirectory()) {
       // Do stuff
   } else {
       // show not directory message
   }    
} else {
   // show not exists message
}

这与实际的程序流程和逻辑结构相同,但“一目了然”发生的事情要清楚得多。

首先执行exists分支:

if (aFile.exists()) {

   if (aFile.isDirectory()) {
       // Do stuff
   } else {
       // show not directory message
   }    
} else {
   // show not exists message
}

这与实际的程序流程和逻辑结构相同,但更清楚地“一目了然”发生了什么。

除了@Tim B的答案外:

它列在下面

总的来说,拥有
是不好的!
if-else
块中的条件
。在大多数情况下,这是由于结构不良造成的:

if(healthy)
     business-logic
else
     error-handling
以上是大多数人(当然不是所有人)认为他们的自然思维方式,而不是

if(!healthy)
     error-handling first
else
     business-logic later
现在,情况并非总是如此——而您的函数(在其名称中暗示)显式地处理错误情况——是可能的例外之一。不幸的是,使用PMD这样的静态代码分析工具,您可以捕获所有情况,也可以不捕获任何情况——在这种情况下,开发人员选择了全部;无可否认,这有点过分热情


无论如何,这就是它被列在PMD设计规则下的原因。遇到这种情况时,我发现最简单的方法是指定源代码,而不是将源代码修改为对我来说毫无意义的代码。

除了@Tim B的答案之外:

它列在下面

总的来说,拥有
是不好的!
if-else
块中的条件
。在大多数情况下,这是由于结构不良造成的:

if(healthy)
     business-logic
else
     error-handling
以上是大多数人(当然不是所有人)认为他们的自然思维方式,而不是

if(!healthy)
     error-handling first
else
     business-logic later
现在,情况并非总是如此——而您的函数(在其名称中暗示)显式地处理错误情况——是可能的例外之一。不幸的是,使用PMD这样的静态代码分析工具,您可以捕获所有情况,也可以不捕获任何情况——在这种情况下,开发人员选择了全部;无可否认,这有点过分热情


无论如何,这就是它被列在PMD设计规则下的原因。当遇到这样的情况时,我发现只需指定,这可能是因为pmd认为肯定的结果应该在
if-else
块中首先出现。这可能是因为pmd认为肯定的结果应该在
if-else
块中首先出现。我认为你的方法并不比在您的方法中,“nota directory”消息是否依赖于现有的目录并不明显。这就是为什么代码被认为可读性较差,并且您会收到警告。我建议的结构很可能不会触发PMD警告,一旦您将代码放入
Do stuff
,它将立即被清除。特别是在您最初的示例中,您生成了错误消息,但仍然继续并执行代码(除非消息也退出了方法)。有争议的不是更好的样式,但PMD认为它是。用
if(C)B else A
切换
if(!C)A else B
。PMD超出了它的目标。@JoopEggen就它的价值而言,我同意它在风格方面没有太多。例如,在代码评审中,我不会抱怨原始代码。我认为您的方法并不比我的好。在您的方法中,“nota directory”消息是否依赖于现有的目录并不明显。这就是为什么代码被认为可读性较差,并且您会收到警告。我建议的结构很可能不会触发PMD警告,一旦您将代码放入
Do stuff
,它将立即被清除。特别是在您最初的示例中,您生成了错误消息,但仍然继续并执行代码(除非消息也退出了方法)。有争议的不是更好的样式,但PMD认为它是。用
if(C)B else A
切换
if(!C)A else B
。PMD超出了它的目标。@JoopEggen就它的价值而言,我同意它在风格方面没有太多。例如,我不会在代码审查中抱怨原始代码。谢谢您的回答。这就是我想知道的。关于您的示例:它很好而且正确,但在某些情况下,当出现问题时,我会得到一个空值,并在业务逻辑之前编写错误处理。谢谢您的回答。这就是我想知道的。关于您的示例:它很好而且正确,但在某些情况下,当出现问题时,我会得到一个空值,并在业务逻辑之前编写错误处理。