30 mai 2025, 10:38:28 Nicolas Jouanne

Tableau des règles Checkstyle et PMD

Le tableau suivant décrit les règle des outils Checkstyle et PMD retenue pour l’analyse du code. L’abréviation c dans la colonne //outil// correspondant à Checkstyle, p à PMD.

Table des matières

Règles de nommage

FonctionnalitéValeurOutilsNom de la règle dans l’outil
Variables locales, finales^[A-Z]*$ - strict (TODO) : strName, nName ou lNamecLocalFinalVariableName
Variables locales, non finales- attention, paramètres de catch inclus^[a-z][a-zA-Z0-9]*$ - strict (TODO) : strName, nName ou lNamecLocalVariableName
Attributs non statiques^_a-z*$ - strict (TODO) : strName, nName ou lNamecMemberName
Paramètres^[a-z][a-zA-Z0-9]*$ - strict (TODO) : strName, nName ou lNamecParameterName
Constantes (champs statiques et finaux)^[A-Z0-9]*$cConstantName
Variables statiques, non finales^_a-z*$ - strict (TODO) : strName, nName ou lNamecStaticVariableName
Méthode[a-z][a-zA-Z0-9]*$cMethodName
Classe (et interface)^[A-Z][a-zA-Z0-9]*$cTypeName
Package^fr.paris.[a-z.]*$cPackageName
Classes abstraitesstrict seulement : mot clé abstractcAbstractClassName
Longueur max d’une variable80 - strict 50pLongVariable
Longueur min du nom d’une méthode3pShortMethodNameRule
Longueur min du nom d’une variablenon retenupShortVariable

Règles non retenues (redondantes)

OutilsRègles
PMDVariableNamingConventionRule, MethodNamingConvention, ClassNamingConventionRule, AbstractNamingRule

En-tête de fichiers

FonctionnalitéValeurOutilsNom de la règle dans l’outil
Les fichiers doivent tous contenir le même en-tête${checkstyle.header.file}cheader
L’en-tête doit correspondre à une expression régulièrenon retenucRegexpHeader

Importations

FonctionnalitéValeurOutilsNom de la règle dans l’outil
Imports inutiles : dupliqué, java.lang.* ou du même packagenacRedondantImports
Idem précédent + import inutiliséenacUnusedImports
Les imports ne doivent pas utiliser *nacAvoidStarImport
Vérifie l’ordre des imports (java, puis javax, …)non retenucImportOrder
Rejette les packages illégaux (par défaut, slt ceux de sun.*)nacIllegalImport

Règles non retenues (redondantes) 2

OutilsRègles
PMDImportFromSamePackage, UnusedImports, DontimportJavaLang, DuplicateImport

Non-respect de longueur

FonctionnalitéValeurOutilsNom de la règle dans l’outil
Longueur max d’une méthodepar défaut : 100 lignes, en comptant les commentaires et les lignes videspExcessiveMethodLength
Longueur max d’une classepar défaut : 1000 lignes, en comptant les commentaires et les lignes videspExcessiveClassLength
Nombre max de paramètrespar défaut : 7cParameterNumber
Complexité : nombre de points de décision10 - strict seulementpCyclomaticComplexityRule
Nombre max de commandes exécutablesnon retenucExecutableStatementCount
Longueur max d’un fichiernon retenucFileLength
Longueur max d’une lignenon retenucLineLength
Longueur max pour une classe anonyme internenon retenucAnonInnerLength
Nombre de méthodes et d’attributs publics45pExcessivePublicCount

Règles non retenues (redondantes) 3

OutilsRègles
PMDExcessiveParameterList
CheckstyleMethodLength, CyclomaticComplexity

Espaces

FonctionnalitéValeurOutilsNom de la règle dans l’outil
Espace non autorisé si un des éléments du for est vide : for(int i;;i++)non retenucEmptyForIteratorPad
Seuls = et == peuvent (doivent) être suivis par un espacetoken=ASSIGN, EQUALcWhitespaceAround
Les parenthèses doivent avoir des espacesspacecParenPad
Vérifie qu’il n’y a pas d’espace après certains opérateursnon retenucNoWhiteSpaceAfter
Vérifie qu’il n’y a pas d’espace avant certains opérateursnon retenucNoWhiteSpaceBefore
Vérifie la façon de gérer les longues lignes après les opérateursnon retenucOperatorWrap
Vérifie les espaces pour le cas particulier des castsnon retenucTypeCastParenPad
Vérifie qu’il n’y a pas de tab dans le code sourcenon retenucTabCharacter
Vérifie que les éléments listés sont bien suivis par un espacenon retenucWhiteSpaceAfter

Qualificatifs

FonctionnalitéValeurOutilsNom de la règle dans l’outil
L’ordre des qualificatifs est : public - protected - private - abstract - static - final - transient - volatile - synchronized - native - strictfpnacModifierOrder
Les interfaces ne sont ni publiques ni abstraites, les méthodes et attributs privés d’une classe finale ne sont pas finaux, dans une interface les variables ne sont ni publiques ni statiques ni finalesnacRedundantModifier

Blocs

FonctionnalitéValeurOutilsNom de la règle dans l’outil
Les blocs ne peuvent pas être vides (concerne : catch, do, else, finally, if, for, try, while et init)nacEmptyBlock
Les blocs switch sont non videsnapEmptySwitchStatements
Les blocs synchronized sont non videsnapEmptySynchronizedBlock
Vérifie que les accolades ouvrantes ( { ) vont à la lignenacLeftCurly
Vérifie que les blocs de code sont bien entourés d’accolades {}nacNeedBraces
Vérifie que les accolades fermantes ( } ) vont à la lignenacRightCurly
Vérifie qu’il ne reste pas de bloc {} qui ne servent plus dans le code (laissés après un debuggage)nacAvoidNestedBlocks

Règles non retenues (redondantes) 4

OutilsRègles
PMDEmptyCatchBlock, EmptyIfStmt, EmptyWhileStmt, EmptyTryBlock, EmptyFinallyBlock, IfStmtsMustUseBraces, WhileLoopsMustUseBracesRule, IfElseStmtsMustUseBracesRule, ForLoopsMustUseBracesRule

Problèmes de code

FonctionnalitéValeurOutilsNom de la règle dans l’outil
Éviter les syntaxes de type **?: **non retenucAvoidInlineConditionals
Vérifier si un test est imbriqué dans un synchronize qui est lui-même imbriqué dans le même testnacDouble Checked Locking
Détecter les instructions vides (;)nacEmptyStatement
Si on surcharge equals [resp hashcode], alors on doit surcharger hashcode [resp equals]nacEqualsHashCode
Une variable ou un paramètre local ne doit pas risquer d’écraser un attributnacHiddenField
Simplifier les retours de booléens - ex : on doit avoir return (! isValid()) au lieu de if (isValid()) return false; else return true;nacSimplifyBooleanReturn
Inutile de tester avec == true ou !false …nacSimplifyBooleanExpression
Vérifie que l’on n’a pas de nombre qui ne soit pas une constante (à part -, 0, 1, et 2)strict seulementcMagicNumber
Vérifie que les switch on bien un default casenacMissingSwitchDefault
Vérifie qu’il ne reste pas une virgule après le dernier élément en initialisant un arraynacArrayTrailingComma
Vérifie que si on définit un equals on a surchargé aussi equals(java.lang.Object)nacCovariantEquals
Vérifie que l’on définit bien dans l’ordre : les attributs statiques, publics, protected, ceux pour le package (sans getter ni setter), privés; les constructeurs; les méthodes.nacDeclarationOrder
Vérifie que l’on n’initialise pas des objets inutilement (comme int i=0; ou object o=null;)nacExplicitInitialization
Les paramètres et variables qui ne sont jamais modifiés doivent être déclarés finalnon retenucFinalLocalVariable
Vérifie que l’on ne catche pas de mauvaise exception (java.lang.Exception , java.lang.Error ou java.lang.RuntimeException )non retenucFinalLocalVariable
Vérifie que l’on utilise bien des factories quand il le fautnon retenucIllegalInstantiation
Interdit certains tokens (comme ++)non retenucIllegalToken
Interdit les valeurs définies par type (par ex : pas de string qui ont la valeur a href, pas d’entier qui commence par 0, …)non retenucIllegalTokenText
Interdit certains types/certaines classesnon retenucIllegalType
Interdit les affectations dans les expressionsnacInnerAssignment
Limite le nombre de if-else imbriqués3cNestedIfDepth
Limite le nombre de try imbriqués3cNestedTryDepth
Chaque classe doit avoir un packagenacPackageDeclaration
Les paramètres ne doivent pas être affectésnacParameterAssignment
Vérifie que l’on ne lance pas 2 fois la même exception, ni une exception unchecked, ni une exception qui soit une sous-classe d’une exception déjà lancéenacRedundantThrows
Limite le nombre de return5cReturnCount
Vérifie que l’on ne compare pas de strings avec == ou !=nacStringLiteralEquality
Vérifie que lorsqu’on surcharge clone(), on appelle super.clone()nacSuperClone
Vérifie que lorsqu’on surcharge finalize(), on appelle super.finalize()nacSuperFinalize
Vérifie l’imbrication de boucles for2pJumbledIncrementer
Certaines boucles for peuvent/doivent être remplacées par des whilenapForLoopShouldBeWhileLoop
Il vaut mieux convertir dans le return que dans une variable temporairenapUnnecessaryConversionTemporaryRule
Vérifie que l’on ne fait pas de return dans un finallynon retenupReturnFromFinallyBlock
Détecte les return; inutilesnapUnnecessaryReturn
Détecte les champs privés non utilisésnapUnusedPrivateField
Détecte les variables locales non utiliséesnapUnusedLocalVariable
Détecte les méthodes privées non utiliséesnapUnusedPrivateMethod
Détecte les paramètres non utilisésnapUnusedFormalParameter
Une classe qui n’a que des méthodes statiques devrait être un singletonna en strict seulementpUnusedLocalVariable
Utiliser l’interface (ex : Set) plutôt que son implémentation (ex HashSet)napLooseCouplingRule
Il vaut mieux utiliser une variable locale que de réutiliser un paramètrenapAvoidReassigningParametersRule
Vérifie la taille du switch (longueur max du case)5pSwitchDensity
Le constructeur ne doit pas appeler de méthode surchargéenapConstructorCallsOverridableMethodRule
Ne pas appeler de constructeur privé en dehors de la classe du constructeurnapAccessorClassGenerationRule
Un champ final constant doit être statiquenapFinalFieldCouldBeStatic
Les connexions doivent toujours être ferméesstrict seulementpCloseConnectionRule
Si la même chaîne est utilisée plusieurs fois, elle doit devenir une constante4pAvoidDuplicateLiterals
Ne pas instancier les strings avec un newnapStringInstantiation
Inutile d’utiliser toString() sur un stringnapStringToString
Considère qu’un objet est trop couplé avec un autre si le nombre d’attributs, variables locales et types retournés est trop important20pCouplingBetweenObjectsRule
Trop d’imports indique que l’objet est trop couplé25pExcessiveImportsRule
Une méthode ne doit pas lancer d’exception de type Exceptionnon retenupSignatureDeclareThrowsException
Il est plus propre de catcher chaque type d’exception (plutôt que de catcher Exception et de faire des instanceof ensuite)napExceptionTypeChecking

Règles non retenues (redondantes) 5

OutilsRègles
PMDOverrideBothEqualsAndHashcodeRule, DoubleCheckedLockingRule, SimplifyBooleanReturnsRule, SimplifyBooleanExpressions, SwitchStmtsShouldHaveDefault, AvoidDeeplyNestedIfStmts, BooleanInstantiation, ProperCloneImplementationRule, AvoidCatchingThrowable, AssignmentInOperandRule

Problèmes de design

FonctionnalitéValeurOutilsNom de la règle dans l’outil
Une méthode non privée et non statique d’une classe qui peut être spécialisée doit être ou abstraite, ou finale, ou videna strict seulementcDesignForExtension
Une classe qui n’a que des constructeurs privés doit être déclarée finalenacFinalClass
Une classe qui ne contient que des méthodes statiques ne doit pas avoir de constructeur publicnacHideUtilityClassConstructor
Les interfaces ne doivent définir que des types (pas d’interface qui ne contient aucune méthode, que des constantes)na strict seulementcInterfaceIsType
Seuls les attributs statiques ET finaux peuvent être publicsnacVisibilityModifier
Vérifie que les classes d’exceptions n’ont que des champs finauxnacMutableException
Vérifie le nombre max de thrownon retenucThrowsCount
Détecte quand il n’y a qu’un seul constructeur, public, vide et sans argumentnon retenupUnnecessaryConstructorRule
Vérifie qu’on n’assigne pas null à des objetsnapNullAssignment
Vérifie qu’il n’y a qu’un seul retour par fonctionnon retenupOnlyOneReturn
Détecte les public static etc inutilesnapUnusedModifier
Oblige chaque classe à avoir un constructeurnon retenupAtLeastOneConstructor
Déclarer finalize() protected si on le surchargenapFinalizeShouldBeProtected

Javadoc

FonctionnalitéValeurOutilsNom de la règle dans l’outil
Chaque package doit avoir un fichier package.htmlnon retenucPackageHtml
Vérifie qu’il y a un javadoc pour la classe (ou l’interface)nacJavadocType
Les variables doivent être commentéesstrict seulementcJavadocVariable
Les classes doivent être commentées (au minimum : @return, @param, @throws et @see)nacJavadocMethod
Valide le contenu des commentaires : phrase complète, tags HTML bien formés, …non retenucJavadocStyle

Junit

FonctionnalitéValeurOutilsNom de la règle dans l’outil
Il est nécessaire d’utiliser les assertions avec messagenapJUnitAssertionsShouldIncludeMessageRule
suite() doit être publique ET statiquenapJUnitStaticSuite
Vérifie que setUp et tearDown sont bien orthographiéesnapJUnitSpelling

Divers

FonctionnalitéValeurOutilsNom de la règle dans l’outil
Détecte le code dupliquénon retenucStrictDuplicateCode
Vérifie que la déclaration d’un tableau est conforme au style retenu (Java-style: public static void main(String[] args) ou C-style: public static void main(String args[]))style JavacArrayTypeStyle
Restreint certains tokens à l’intérieur de certains autresnon retenucDescendantToken
Vérifie que les paramètres sont finaux (sauf pour les interfaces)non retenucFinalParameters
grep pour une expression régulière donnéeSystem.out.println, System.exitcGenericIllegalRegexp
Vérifie l’indentationnon retenucIndentation
Vérifie que tous les fichiers terminent bien par un retour à la lignenon retenucNewlineAtEndOfFile
Cherche les commentaires TODO:non retenucTodoComment
Vérifie que les fichiers properties de différents langages contiennent les mêmes clésnacTranslation
Détecte les méthodes main non commentéesnon retenucUncommentedMain
Les constantes de type long doivent commencer par Lnon retenucUpperEll