PMD - 代码分析器警告

时间:2011-01-04 23:18:07

标签: java code-analysis pmd

我正在使用PMD来分析代码,它会产生一些我不知道如何修复的高优先级警告。

1)Avoid if(x!=y)..; else...;但是,如果我需要这个逻辑,我该怎么办?也就是说,我确实需要检查是否x!=y?我怎么能重构它?

2)Use explicit scoping instead of the default package private level.但是这个类确实只在包中使用。我应该使用什么访问修饰符?

3)Parameter is not assigned and could be declared final.我应该在PMD用这个警告指出的所有地方添加final关键字吗?

5 个答案:

答案 0 :(得分:30)

避免否定而不是if( x!=y ) doThis() else doThat(),首先检查阳性病例,因为人/人倾向于喜欢积极的事情而不是消极。它会扭曲大脑,在阅读源代码时必须扭转逻辑。所以,写一下:

 if ( x!=y ) doThis() else doThat()       // Bad - negation first
 if ( x==y ) doThat() else doThis()       // Good - positive first

显式范围界定:根据PMD website,这是一个有争议的规则。你可能讨厌它,有人喜欢它。你应该做的是让你班级中的所有领域都是私人的。似乎存在具有包可见性的字段或方法(不是类),例如像这样的东西:

 class Foo {
   /* private missing */ Object bar;
 }

最终参数:方法参数应该是最终的,以避免意外重新分配。这只是一个很好的做法。如果您正在使用Eclipse,内容辅助甚至会提供一个名为“将修改器更改为最终版本”的快速修复程序。只需使用Ctrl-a选择编辑器中的所有代码,然后按Ctrl-1。

答案 1 :(得分:6)

您无需启用所有规则。选择您同意的一些规则并重构代码,直到清除所有警告。

1 - 将其重构为if (x == y) ... else ...逻辑。只要避免在判断中出现负面情况,就会使代码难以理解

2 - 我不会启用该规则。

3 - 很多人宣称很多字段和变量都是最终的。特别是当他们想要确定或表示在该方法中不应改变变量的值时。如果您不喜欢,请禁用该规则。

答案 2 :(得分:4)

这些似乎都是可以关闭的小警告。

1)它要你翻转逻辑

if(x==y) {
    //old else clause
} else {
    //old if clause
}

2)如果包确实是您想要的正确访问权限,则无需添加访问修饰符。我不熟悉是否有办法压制那个特定的警告。

3)风格问题。有些人想要最终的一切。其他人则认为它对于少量信息增加了太多的混乱。如果您在后一个营地,请关闭该警告。

答案 3 :(得分:4)

关于第一项(不平等),有两个问题:

1)双重否定的可读性。

说你有:

if(x!=y) { false clause } else { true clause }

如果“not x不等于y”,则执行第二个子句。

这可以改写为:

if (x==y) {true clause } else {false clause}.

2)正确性:如果x和y不是基元,使用if(!x.equals(y))会更安全。 这相当于使用==而不是.equals(),并且可能导致非常严重的错误。

答案 4 :(得分:1)

您还可以在不希望检查PMD规则的任何行的末尾使用// NOPMD

例如,对于上面给出的代码,您可以通过给出

来抑制PMD检查
class Foo {
   /* private missing */ Object bar; // NOPMD
 }

请注意,上述评论可能会默默禁止相同行中的其他警告。