PMDとCheckStyleを比較する質問がありました。ただし、PMDとFindBugsの違い/類似性については、うまく分類できません。主な違いは、PMDがソースコードで機能するのに対し、FindBugsはコンパイル済みバイトコードファイルで機能することです。しかし、機能に関しては、どちらか一方または両方の選択である必要がありますか、それとも互いに補完し合うのでしょうか?
PMDとCheckStyleを比較する質問がありました。ただし、PMDとFindBugsの違い/類似性については、うまく分類できません。主な違いは、PMDがソースコードで機能するのに対し、FindBugsはコンパイル済みバイトコードファイルで機能することです。しかし、機能に関しては、どちらか一方または両方の選択である必要がありますか、それとも互いに補完し合うのでしょうか?
回答:
両方を使用しています。それらは互いに補完し合うと思います。
あなたが言ったように、PMDはソースコードで動作するため、命名規則の違反、中括弧の欠如、nullチェックの誤配置、長いパラメーターリスト、不必要なコンストラクター、スイッチの欠落などを検出します。PMDは、Cyclomaticについても通知します私のコードが非常に役立つコードの複雑さ(FindBugsはCyclomaticの複雑さについて教えてくれません)。
FindBugsはバイトコードで動作します。FindBugsがPMDが検出しないいくつかの問題を次に示します。equals()メソッドはサブタイプで失敗し、クローンメソッドはnullを返す可能性があります。ブール値の参照比較、不可能なキャスト、32ビットの整数が0〜31の範囲ではない量だけシフトされます。それ自体を含むコレクション、equalsメソッドは常にtrue、無限ループなどを返します。
通常、それぞれが異なる問題のセットを見つけます。両方を使う。これらのツールは、優れたJavaコードの作成方法について多くのことを教えてくれました。
PMDの最高の機能は、XPathルールであり、Rule Designerにバンドルされており、コードサンプルから新しいルールを簡単に構築できます(RegExおよびXPath GUIビルダーと同様)。FindBugsは追加設定なしで強力ですが、プロジェクト固有のルールとパターンを構築することは非常に重要です。
たとえば、2つのネストされたforループを含むパフォーマンスの問題が発生し、O(n ^ 2)の実行時間が発生しましたが、簡単に回避できました。PMDを使用してアドホッククエリを作成し、ネストされたforループの他のインスタンスを確認しました-// ForStatement / Statement // ForStatement。これにより、問題のインスタンスがさらに2つ指摘されました。これは一般的な規則ではありません。