4

我最近才发现 PMD 并想用它改进我的代码。因此,我启用了所有规则(并获得了 47000 次违规:P)。无论如何,我对此有一个问题:

double mean = 0;
for (int p : points)
  mean += full[1][p];
mean /= points.size();

for each循环中,PMD 告诉我局部变量 'p' 可以声明为 final。如果我将其更改为

double mean = 0;
for (final int p : points)
  mean += full[1][p];
mean /= points.size();

它告诉我避免使用最终局部变量,将它们变成 fields。第二次违规对我来说真的没有意义。这样做的“正确”方法是什么?(我意识到可能有不同的方式,我只是想知道 PMD 希望它是怎样的。)

4

2 回答 2

4

我认为您在 pmd 的规则中发现了不一致之处,当遵循其中一条规则会使您违反另一条规则时。

我认为第一个循环很好:第二个循环也很好,但是使用final那里是相当非正统的。final在没有正当理由的情况下添加一个+可能会让非常有经验的开发人员绊倒。由于您不想让阅读程序变得比现在更难,因此我建议您跳过finalinforeach循环。


+使匿名类可以使用循环变量是一个很好的原因。

于 2013-05-15T10:57:37.307 回答
0

将 final 关键字保留在 for 循环中。这将防止人们重新分配循环变量。

要解决“避免使用最终局部变量,请将它们转换为字段”的问题

double vStd = 0;,假设您没有重新分配它的值,您可以将其声明为类常量。

另外,请在单独的行中声明每个变量:

double vStd = 0;
double mean = 0;
于 2014-02-05T02:05:39.610 回答