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();

最終的なローカル変数の使用を回避し、フィールドに変換するように指示されます。2 番目の違反は、私にはあまり意味がありません。これを行う「正しい」方法は何ですか?(私は、異なる方法があるかもしれないことを理解しています.PMDがどのようになりたいかを知りたいだけです。)

4

2 に答える 2

4

規則の 1 つに従うと別の規則に違反する場合、pmd の規則に矛盾があることを発見したと思います。

最初のループはそのままで問題ないと思います。2 番目のループも問題なく動作しますが、finalそこを使用するのはかなり異例です。final正当な理由なしに+を追加すると、非常に経験豊富な開発者でさえつまずく可能性があります。プログラムの読み取りをこれ以上難しくしたくないので、finalinforeachループをスキップすることをお勧めします。


+ループ変数を匿名クラスで使用できるようにすることは、そのような正当な理由の 1 つです。

于 2013-05-15T10:57:37.307 に答える
0

for ループ内に final キーワードを保持します。これにより、人々がループ変数を再割り当てするのを防ぐことができます。

「最終的なローカル変数の使用を避け、それらをフィールドに変換する」を回避するには

double vStd = 0;、その値を再割り当てしていない場合は、代わりにこれをクラス定数として宣言できます。

さらに、各変数をそれぞれの行で宣言してください。

double vStd = 0;
double mean = 0;
于 2014-02-05T02:05:39.610 に答える