Il y avait une question comparant PMD et CheckStyle . Cependant, je ne trouve pas de ventilation agréable sur les différences/similitudes entre PMD et FindBugs. Je crois qu'une différence clé est que PMD fonctionne sur le code source, tandis que FindBugs fonctionne sur les fichiers de bytecode compilés. Mais en termes de capacités, devrait-il être un choix ou/ou se complètent-ils?
J'utilise les deux. Je pense qu'ils se complètent.
Comme vous l'avez dit, PMD fonctionne sur le code source et trouve donc des problèmes comme: violation des conventions de dénomination, manque d'accolades, vérification nulle mal placée, longue liste de paramètres, constructeur inutile, rupture d'interrupteur manquante, etc. PMD vous parle également de la complexité cyclomatique de votre code que je trouve très utile (FindBugs ne vous parle pas de la complexité cyclomatique).
FindBugs fonctionne sur bytecode. Voici quelques problèmes que FindBugs trouve, ce que PMD ne fait pas: la méthode equals () échoue sur les sous-types, la méthode clone peut retourner null, la comparaison de référence des valeurs booléennes, la conversion impossible, int 32 bits décalé d'une quantité non comprise entre 0 et 31, une collection qui se contient, la méthode equals renvoie toujours true, une boucle infinie, etc.
Habituellement, chacun d'eux trouve un ensemble différent de problèmes. Utilise les deux. Ces outils m'ont beaucoup appris à écrire du bon code Java.
La meilleure fonctionnalité de PMD est son règles XPath, fourni avec un concepteur de règles pour vous permettre de construire facilement de nouvelles règles à partir d'exemples de code (similaires aux constructeurs RegEx et XPath GUI). FindBugs est plus fort, mais la construction de règles et de modèles spécifiques au projet est très importante.
Par exemple, j'ai rencontré un problème de performances impliquant 2 boucles imbriquées, résultant en un temps d'exécution O (n ^ 2), qui pourrait facilement être évité. J'ai utilisé PMD pour construire une requête ad-hoc, pour examiner d'autres instances de boucles imbriquées - // ForStatement/Statement // ForStatement. Cela a souligné 2 autres cas du problème. Ce n'est pas du tout une règle générique.
PMD est