PMDとCheckStyleを比較する質問 がありました。ただし、PMDとFindBugsの相違点/類似点についてのニースの内訳は見つかりません。主な違いは、PMDはソースコードで動作し、FindBugsはコンパイルされたバイトコードファイルで動作することです。しかし、機能に関しては、どちらかまたは両方の選択肢である必要がありますか、それとも互いに補完するのでしょうか?
私は両方を使用しています。それらは互いに補完し合っていると思います。
あなたが言ったように、 [〜#〜] pmd [〜#〜] はソースコードで動作し、したがって命名規則の違反、中括弧の欠如、ヌルチェックの置き忘れ、長いパラメーターリスト、不必要なコンストラクター、スイッチのブレークの欠落など。PMDは、コードの Cyclomaticの複雑さ についても教えてくれます(FindBugsはCyclomaticの複雑さについて教えてくれません)。
FindBugs はバイトコードで動作します。 FindBugsがPMDで見つけられない問題を以下に示します:equals()メソッドはサブタイプで失敗します。cloneメソッドはnullを返す場合があります。それ自体を含むコレクション、equalsメソッドは常にtrue、無限ループなどを返します。
通常、それぞれが異なる問題のセットを見つけます。両方を使う。これらのツールは、良いJavaコード。
PMDの最良の機能は、XPathルールであり、Rule Designerにバンドルされており、コードサンプルから新しいルールを簡単に構築できます(RegExおよびXPath GUIビルダーと同様)。 FindBugsはすぐに使用できますが、プロジェクト固有のルールとパターンを構築することは非常に重要です。
たとえば、2つのネストされたforループを含むパフォーマンスの問題が発生し、O(n ^ 2)の実行時間が発生しましたが、これは簡単に回避できます。 PMDを使用してアドホッククエリを作成し、ネストされたforループの他のインスタンスを確認します-// ForStatement/Statement // ForStatement。これは、問題のさらに2つのインスタンスを指摘しました。これは一般的なルールではありません。
PMDは