我正在使用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关键字吗?
答案 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
}
请注意,上述评论可能会默默禁止相同行中的其他警告。