Java 每个循环的PMD违规开启(是否最终?)
我最近刚刚发现了PMD,并想用它改进我的代码。因此,我启用了所有规则(并得到47000个违规:P)。不管怎样,我对这个有一个问题:Java 每个循环的PMD违规开启(是否最终?),java,foreach,final,pmd,Java,Foreach,Final,Pmd,我最近刚刚发现了PMD,并想用它改进我的代码。因此,我启用了所有规则(并得到47000个违规:P)。不管怎样,我对这个有一个问题: double mean = 0; for (int p : points) mean += full[1][p]; mean /= points.size(); 在每个循环的上,PMD告诉我可以将局部变量“p”声明为final。如果我把它改成 double mean = 0; for (final int p : points) mean += full[
double mean = 0;
for (int p : points)
mean += full[1][p];
mean /= points.size();
在每个循环的上,PMD告诉我可以将局部变量“p”声明为final。如果我把它改成
double mean = 0;
for (final int p : points)
mean += full[1][p];
mean /= points.size();
它告诉我要避免使用最终的局部变量,将它们转换为字段。第二次违规对我来说毫无意义。“正确”的方法是什么?(我意识到可能有不同的方式,我只想知道PMD希望它是怎样的。)我认为您发现PMD的规则不一致,当遵循其中一条规则会导致您违反另一条规则时
我认为第一个循环也很好:第二个循环也很好,但是使用final
是非常不正常的。在那里添加一个final
而没有好的理由+可能会让非常有经验的开发人员绊倒。由于您不想让阅读程序变得更加困难,我建议跳过foreach
循环中的final
+使循环变量可用于匿名类就是一个很好的理由。将final关键字保留在for循环中。这将防止人们重新分配循环变量
要解决“避免使用最终局部变量,将它们转换为字段”的问题,请打开
double-vStd=0代码>,假定尚未重新分配其值,则可以将其声明为类常量
此外,请在各自的行中声明每个变量:
double vStd = 0;
double mean = 0;
对我来说,这看起来像pmd规则中的一个bug。只是出于好奇-您如何增加(或更改)循环中的最后一个计数器?;)我正在使用PMD eclipse插件(PMD插件4.0.0.v20130510-1000
)。@brimborium-啊,好的,快速搜索一下,解释一下,为什么它会工作;)我认为第一个循环可以正常工作:第二个循环可以正常工作,但是使用final
是非常非正统的,甚至可能会绊倒有经验的开发人员(查看上面评论中的对话,了解一个好的示例)。您不想让读取程序变得更困难,因此,除非出于其他目的(例如使变量可用于匿名类)必须在那里有一个final
,否则我建议跳过final
。我得到了避免使用final局部变量的建议,请将它们转换为上的字段(最终积分p:分)
而不是在vStd
上。所以这不起作用。如果我删除final
分类器,PMD会返回到局部变量“p”可以声明为final。谢谢你每行声明一条注释,我通常遵循这条规则。在这种情况下,我只想保持代码紧凑。我从中删除了vStd
这是一个奇怪的例子,我的IDE上没有你的代码的标志。我已启用该规则。我使用eclipse Indigo SR2和eclipse pmd插件v0.8.0.201401251911,它使用pmd 5.0.5.Ah,所以它可能得到了修复。我的帖子已经快一年了。。。我再也没有这种设置了。