具體項的具體說明請參考:https://www.cnblogs.com/ziyuyuyu/p/9870717.html
梳理此次完整checkstyle.xml說明,以備以后再此基礎上刪減
<?xml version="1.0"?> <!DOCTYPE module PUBLIC "-//Puppy Crawl//DTD Check Configuration 1.3//EN" "http://www.puppycrawl.com/dtds/configuration_1_3.dtd"> <module name="Checker"> <module name="TreeWalker"> <!-- =============注釋檢查============= --> <!-- 檢查類和接口的javadoc 默認不檢查author 和version tags authorFormat: 檢查author標簽的格式 versionFormat: 檢查version標簽的格式 scope: 可以檢查的類的范圍,例如:public只能檢查public修飾的類,private可以檢查所有的類 excludeScope: 不能檢查的類的范圍,例如:public,public的類將不被檢查,但訪問權限小於public的類仍然會檢查,其他的權限以此類推 tokens: 該屬性適用的類型,例如:CLASS_DEF,INTERFACE_DEF --> <module name="JavadocType"> <property name="authorFormat" value="\S"/> <property name="scope" value="protected"/> <property name="versionFormat" value="\$Revision.*\$"/> <property name="excludeScope" value="public"/> <property name="tokens" value="CLASS_DEF,INTERFACE_DEF"/> </module> <!-- 檢查方法的javadoc的注釋 scope: 可以檢查的方法的范圍,例如:public只能檢查public修飾的方法,private可以檢查所有的方法 allowMissingParamTags: 是否忽略對參數注釋的檢查 allowMissingThrowsTags: 是否忽略對throws注釋的檢查 allowMissingReturnTag: 是否忽略對return注釋的檢查 --> <module name="JavadocMethod"> <property name="scope" value="private"/> <property name="allowMissingParamTags" value="false"/> <property name="allowMissingThrowsTags" value="false"/> <property name="allowMissingReturnTag" value="false"/> <property name="tokens" value="METHOD_DEF"/> <property name="allowUndeclaredRTE" value="true"/> <property name="allowThrowsTagsForSubclasses" value="true"/> <!--允許get set 方法沒有注釋--> <property name="allowMissingPropertyJavadoc" value="true"/> </module> <!-- 檢查變量是否具有Javadoc注釋 scope: 檢查變量的范圍,例如:public只能檢查public修飾的變量,private可以檢查所有的變量 --> <module name="JavadocVariable"> <property name="scope" value="private"/> </module> <!-- =============命名檢查============= --> <!-- 檢查抽象類的名稱是否遵守命名規約 format: 定義抽象類的命名規則 --> <module name="AbstractClassName"> <property name="format" value="^Abstract.*$|^.*Factory$"/> </module> <!-- 檢查常量(用static final修飾的字段)的名稱是否遵守命名規約 format: 定義全局常量的命名規則 --> <module name="ConstantName"> <property name="format" value="^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$"/> </module> <!-- 檢查局部final變量的名稱是否遵守命名規約 format: 定義局部常量的命名規則 --> <module name="LocalFinalVariableName"> <property name="format" value="^[A_Z][A-Z0-9]*(_[A_Z0-9]+)*$"/> </module> <!-- 檢查局部變量的名稱是否遵守命名規約 format: 定義局部常量的命名規則 --> <module name="LocalVariableName"> <property name="format" value="^[a-z][a-zA-Z0-9]*$"/> </module> <!-- 檢查成員變量(非靜態字段)的名稱是否遵守命名規約 format: 定義非靜態成員變量的命名規則 applyToPublic: 是否適用於public的成員變量 applyToProtected: 是否適用於protected的成員變量 applyToPackage: 是否適用於package的成員變量 applyToPrivate: 是否適用於private的成員變量 --> <module name="MemberName"> <property name="format" value="^[a-z][a-zA-Z0-9]*$"/> <property name="applyToPublic" value="true"/> <property name="applyToProtected" value="true"/> <property name="applyToPackage" value="true"/> <property name="applyToPrivate" value="true"/> </module> <!-- 檢查方法名稱是否遵守命名規約 format: 定義方法名的命名規則 --> <module name="MethodName"> <property name="format" value="^[a-z][a-zA-Z0-9]*$"/> </module> <!-- 檢查包名稱是否遵守命名規約 format: 定義包名的命名規則 --> <module name="PackageName"> <property name="format" value="^[a-z]+(\.[a-z][a-z0-9]*)*$"/> </module> <!-- 檢查參數名稱是否遵守命名規約 format: 定義參數名的命名規則 --> <module name="ParameterName"> <property name="format" value="^[a-z][a-zA-Z0-9]*$"/> </module> <!-- 檢查靜態變量(用static修飾,但沒用final修飾的字段)的名稱是否遵守命名規約 format: 定義靜態變量的命名規則 --> <module name="StaticVariableName"> <property name="format" value="^[a-z][a-zA-Z0-9]*$"/> </module> <!-- 檢查類的名稱是否遵守命名規約 format: 定義類和接口的命名規則 tokens: 定義規則適用的類型,例如:CLASS_DEF表示類,INTERFACE_DEF 表示接口 --> <module name="TypeName"> <property name="format" value="^[A-Z][a-zA-Z0-9]*$"/> <property name="tokens" value="CLASS_DEF,INTERFACE_DEF"/> </module> <!-- =============import檢查=============--> <!-- 檢查沒有import語句使用*符號 excludes: 定義可以使用*導入的包 --> <module name="AvoidStarImport"> <property name="excludes" value="java.io,java.util"/> </module> <!-- 檢查是否導入了指定的非法包 --> <module name="IllegalImport"/> <!-- 檢查導入包的順序/分組 groups: 定義導入包的順序,默認以字母順序導入 ordered: 定義包是否必須按規定的順序顯示 separated: 定義包與包之間是否應添加空白行 caseSensitive: 是否區分包名的大小寫 --> <module name="ImportOrder"> <property name="groups" value="java,javax"/> <property name="ordered" value="true"/> <property name="separated" value="true"/> <property name="caseSensitive" value="true"/> </module> <!-- 檢查是否存在多余的導入語句 --> <module name="RedundantImport"/> <!-- 檢查未使用的導入語句 --> <module name="UnusedImports"/> <!-- =============長度檢查============= --> <!-- 檢查匿名內部類的長度 max: 定義匿名內部類最多容許的行數 --> <module name="AnonInnerLength"> <property name="max" value="20"/> </module> <!-- 檢查要執行的語句的數目,將可執行語句的數量限制為一個指定的限值 max: 定義所能容許的語句的最多數目 tokens: 定義可以檢查的類型,例如:CTOR_DEF,METHOD_DEF,STATIC_INIT,INSTANCE_INIT --> <module name="ExecutableStatementCount"> <property name="max" value="20"/> <property name="tokens" value="CTOR_DEF,METHOD_DEF,STATIC_INIT,INSTANCE_INIT"/> </module> <!-- 檢查源碼文件的長度 max: 定義一個文件所能容許的行數 --> <module name="FileLength"> <property name="max" value="1000"/> </module> <!-- 檢查源碼每行的長度 --> <module name="LineLength"> <property name="max" value="80"/> <property name="ignorePattern" value="^ *\* *[^ ]+$"/> </module> <!-- 檢查方法和構造器的長度 max: 最多容許的行數 countEmpty: 是否計算空行 tokens: 定義檢查的類型 --> <module name="MethodLength"> <property name="max" value="100"/> <property name="countEmpty" value="true"/> <property name="tokens" value="METHOD_DEF"/> </module> <!-- 檢查一個方法或構造器的參數的數量 max: 定義最多有多少個參數 tokens: 定義檢查的類型 --> <module name="ParameterNumber"> <property name="max" value="10"/> <property name="tokens" value="METHOD_DEF,CTOR_DEF"/> </module> <!-- =============空格檢查============= --> <!-- 檢查空的for循環初始化語句的填充符 option: 定義初始化語句中是否使用空格,例如:space表示使用空格,則for(int i = 0; i < 100; i++) 就是符合格式要求的,而for(int i=0; i<100;i++)就不符合要求 --> <module name="EmptyForInitializerPad"> <property name="option" value="space"/> </module> <!-- 檢查for iterator語句是否使用空格 option:定義初始化語句是否使用空格,例如:space表示使用空格,則for(Iterator iterator = List.iterator();iterator.hasNext(); iterator.next())就是形式合理的,否則就是形式不合理的 --> <module name="EmptyForIteratorPad"> <property name="option" value="space"/> </module> <!-- 檢查指定標記之后沒有空格。若要禁用指定標記之后的換行符,將allowLineBreaks屬性設為false即可。 --> <module name="NoWhitespaceAfter"/> <!-- 檢查指定標記之前沒有空格。若要允許指定標記之前的換行符,將allowLineBreaks屬性設為true即可 --> <module name="NoWhitespaceBefore"/> <!-- 檢查代碼自動換行時,運算符所處位置的策略 option: 定義運算符的位置,eol在同一行,nl在下一行 tokens: 定義檢查的類型 --> <module name="OperatorWrap"> <property name="tokens" value="ASSIGN, DIV, DIV_ASSIGN, PLUS_ASSIGN, MINUS, MINUS_ASSIGN, STAR, STAR_ASSIGN, MOD, MOD_ASSIGN, SR, SR_ASSIGN, BSR, BSR_ASSIGN, SL, SL_ASSIGN, BXOR, BXOR_ASSIGN, BOR, BOR_ASSIGN, BAND, BAND_ASSIGN,PLUS, QUESTION"/> <property name="option" value="eol"/> </module> <!-- 檢查方法定義、構造器定義、方法調用、構造器調用的標識符和參數列表的左圓括號之間的填充符 allowLineBreaks: 參數是否允許在不同行 option: 在參數和括號、參數和標識符之間是否包含空格 tokens: 檢查的類型 --> <module name="MethodParamPad"> <property name="allowLineBreaks" value="false"/> <property name="option" value="space"/> <property name="tokens" value="METHOD_DEF,CTOR_DEF"/> </module> <!-- 檢查圓括號的填充符策略,也就是在左圓括號之后和右圓括號之前是否需要有一個空格 option: space表示有空格,nospace表示沒有空格 tokens: 定義檢查的類型 --> <module name="ParenPad"> <property name="option" value="nospace"/> </module> <!-- 檢查類型轉換的圓括號的填充符策略。也就是,在左圓括號之后和右圓括號之前是否需要有一個空格 option: space表示有空格,nospace表示沒有空格 tokens: 定義檢查的類型 --> <module name="TypecastParenPad"> <property name="option" value="space"/> </module> <!-- 檢查源碼中沒有制表符('\t') --> <module name="TabCharacter"/> <!-- 檢查指定標記之后是否緊跟了空格 tokens: 檢查的類型 --> <module name="WhitespaceAfter"> <property name="tokens" value="COMMA,SEMI,TYPECAST"/> </module> <!-- 檢查指定標記的周圍是否有空格 可以選擇性地從檢查策略中排除,通過設置allowEmptyMethods和allowEmptyConstructors屬性即可 tokens: 檢查的類型 --> <module name="WhitespaceAround"> <property name="tokens" value="ASSIGN"/> </module> <!-- =============修飾符檢查============= --> <!-- 檢查代碼中的標識符的順序是否符合《Java Language Specification》中的第8.1.1、8.3.1章節所建議的順序 正確的順序應當如下: 1. public 2. protected 3. private 4. abstract 5. static 6. final 7. transient 8. volatile 9. synchronized 10. native 11. strictfp --> <module name="ModifierOrder"/> <!-- 在以下部分檢查是否有多余的修飾符: 1. 接口和注解的定義; 2. final類的方法的final修飾符; 3. 被聲明為static的內部接口聲明 tokens: 檢查的類型 --> <module name="RedundantModifier"> <property name="tokens" value="METHOD_DEF,VARIABLE_DEF"/> </module> <!-- =============代碼塊檢查============= --> <!-- 找到嵌套代碼塊,也就是在代碼中無節制使用的代碼塊 allowInSwitchCase: 定義是否允許switch case中使用嵌套的代碼塊 --> <module name="AvoidNestedBlocks"> <property name="allowInSwitchCase" value="true"/> </module> <!-- 檢查空代碼塊 option: 定義代碼塊中應該包含的內容,例如:stmt表示語句 tokens: 檢查的類型 --> <module name="EmptyBlock"> <property name="option" value="stmt"/> </module> <!-- 檢查代碼塊的左花括號的放置位置 option: 定義左大括號'{'顯示位置,eol在同一行顯示,nl在下一行顯示 maxLineLength: 大括號'{'所在行行最多容納的字符數 tokens: 該屬性適用的類型,例:CLASS_DEF,INTERFACE_DEF,METHOD_DEF,CTOR_DEF --> <module name="LeftCurly"> <property name="option" value="eol"/> <property name="maxLineLength" value="80"/> <property name="tokens" value="CLASS_DEF,INTERFACE_DEF,METHOD_DEF,CTOR_DEF"/> </module> <!-- 檢查代碼塊周圍是否有大括號,可以檢查do、else、if、for、while等關鍵字所控制的代碼塊 tokens: 定義檢查的類型 --> <module name="NeedBraces"/> <!-- 檢查else、try、catch標記的代碼塊的右花括號的放置位置 tokens: 定義檢查的類型 --> <module name="RightCurly"> <property name="option" value="alone"/> <property name="tokens" value="LITERAL_TRY"/> </module> <!-- =============編碼檢查============= --> <!-- 檢查是否在同一行初始化, 例如:private int Age = nGe==1 ? 100 : 0; 就應該避免 --> <module name="AvoidInlineConditionals"/> <!-- 檢查定義了共變equals()方法的類中是否同樣覆蓋了equals(java.lang.Object)方法 --> <module name="CovariantEquals"/> <!-- 檢查switch語句中的default是否在所有的case分支之后 --> <module name="DefaultComesLast"/> <!-- 檢查空的代碼段 --> <module name="EmptyStatement"/> <!-- 檢查覆蓋了equals()方法的類是否也覆蓋了hashCode()方法 --> <module name="EqualsHashCode"/> <!-- 檢查類或對象的成員是否顯式地初始化為成員所屬類型的默認值 (對象引用的默認值為null,數值和字符類型的默認值為0,布爾類型的默認值為false) --> <module name="ExplicitInitialization"/> <!-- 檢查switch語句中是否存在跨越分支。 如果一個case分支的代碼中缺少break、return、throw或continue語句,那么就會導致跨越分支 --> <module name="FallThrough"/> <!-- 檢查變量值沒有改動的情況下,該變量是否定義成了final --> <module name="FinalLocalVariable"/> <!-- 檢查局部變量或參數是否會遮蔽在相同類中定義的字段 --> <module name="HiddenField"/> <!-- 檢查是否有不合法的實例化操作,是否使用工廠方法更好 --> <module name="IllegalInstantiation"/> <!-- 非法異常捕捉,不允許捕捉java.lang.Exception、java.lang.Error、java.lang.RuntimeException的行為 --> <module name="IllegalCatch"/> <!-- 檢查子表達式中是否有賦值操作 --> <module name="InnerAssignment"/> <!-- 檢查是否有"魔術"數字 --> <module name="MagicNumber"> <property name="ignoreNumbers" value="0, 1"/> <property name="ignoreAnnotation" value="true"/> </module> <!-- 檢查switch語句是否含有default子句 --> <module name="MissingSwitchDefault"/> <!-- 檢查循環控制變量是否被修改 --> <module name="ModifiedControlVariable"/> <!-- 檢查一個字符串變量在不改變變量值的情況下或者字符串出現的次數 allowedDuplicates: 定義在類中一個字符串變量在不改變變量值的情況下或者字符串所能使用的最多次數 --> <module name="MultipleStringLiterals"> <property name="allowedDuplicates" value="3"/> </module> <!-- 檢查一次聲明多個變量時,變量是否在同一行或者在同一個語句中 --> <module name="MultipleVariableDeclarations"/> <!-- 限制if-else代碼塊的嵌套層數(默認值為1)--> <module name="NestedIfDepth"> <property name="max" value="1"/> </module> <!-- 限制try代碼塊的嵌套層數(默認值為1)--> <module name="NestedTryDepth"> <property name="max" value="3"/> </module> <!-- 確保一個類具有一個包聲明,並且(可選地)包名要與源代碼文件所在的目錄名相匹配 --> <module name="PackageDeclaration"/> <!-- 不允許對參數進行賦值 --> <module name="ParameterAssignment"/> <!-- 檢查throws子句中是否聲明了多余的異常 --> <module name="RedundantThrows"> <property name="allowUnchecked" value="true"/> <property name="allowSubclasses" value="true"/> </module> <!-- 檢查是否使用了this --> <module name="RequireThis"> <property name="checkFields" value="false"/> <property name="checkMethods" value="false"/> </module> <!-- 禁止使用System.out.println --> <module name="Regexp"> <property name="format" value="System\.out\.println"/> <property name="illegalPattern" value="true"/> </module> <!-- 限制return語句的數量。默認值為2。可以忽略檢查指定的方法(默認忽略equals()方法 --> <module name="ReturnCount"> <property name="max" value="3"/> </module> <!-- 檢查是否有過於復雜的布爾表達式。現在能夠發現諸如if (b == true)、b || true、!false等類型的代碼 --> <module name="SimplifyBooleanExpression"/> <!-- 檢查是否有過於復雜的布爾類型return語句 --> <module name="SimplifyBooleanReturn"/> <!-- 檢查在判斷字符串是否相等時是否使用了正確的形式 --> <module name="StringLiteralEquality"/> <!-- 檢查一個覆蓋的clone()方法是否調用了super.clone()方法 --> <module name="SuperClone"/> <!-- 檢查一個覆蓋的finalize()方法是否調用了super.finalize()方法 --> <module name="SuperFinalize"/> <!-- 檢查初始化數祖時,最后一個元素后面是否加了逗號,如果左右大括號都在同一行,則可以不加逗號 --> <module name="ArrayTrailingComma"/> <!-- 檢查代碼中是否使用了不必要的圓括號 --> <module name="UnnecessaryParentheses"/> <!-- =============類設計檢查============= --> <!-- 檢查類是否被設計為可擴展的,如果是,則方法應該abstract、final或者是空的 --> <module name="DesignForExtension"/> <!-- 檢查一個只有私有構造器的類是否被聲明為final --> <module name="FinalClass"/> <!-- 確保工具類(在API中只有靜態方法和字段的類)沒有任何公有構造器 --> <module name="HideUtilityClassConstructor"/> <!-- 檢查接口是否只定義了變量而沒有定義方法,因為接口應該用來描述一個類型,所以只定義變量而不定義方法是不恰當的 allowMarkerInterfaces: 是否檢查空接口 --> <module name="InterfaceIsType"> <property name="allowMarkerInterfaces" value="true"/> </module> <!-- 將異常拋出語句的數量配置為一個指定的限值(默認值為1)--> <module name="ThrowsCount"> <property name="max" value="7"/> </module> <!-- 檢查類成員的可見性。 只有static final的類成員可以是公有的,其他的類成員必須是私有的,除非設置了protectedAllowed屬性或packageAllowed屬性 packageAllowed: 變量包內成員可以訪問 protectedAllowed: 變量是受保護的 publicMemberPattern: 可以公開訪問的變量所匹配的命名形式 --> <module name="VisibilityModifier"> <property name="packageAllowed" value="false"/> <property name="protectedAllowed" value="false"/> <property name="publicMemberPattern" value="^seriaVersionUID$"/> </module> <!-- =============重復檢查============= --> <!-- 逐行地比較所有的代碼行,如果有若干行只有縮進有所不同,那么就報告存在重復代碼 min: 允許代碼重復的最小行數 charset: 文件所用的字符集 --> <module name="StrictDuplicateCode"> <property name="min" value="7"/> <property name="charset" value="UTF-8"/> </module> <!-- =============度量檢查============= --> <!-- 限制一個表達式中的&&、||、&、|、^等邏輯運算符的數量 max: 布爾運算符在一條語句中允許出現的最大數目 --> <module name="BooleanExpressionComplexity"> <property name="max" value="7"/> </module> <!-- 測量給定類中的其他類的實例化操作的次數 --> <module name="ClassDataAbstractionCoupling"> <property name="max" value="7"/> </module> <!-- 檢查循環復雜度是否超出了指定的限值。 該復雜度由構造器、方法、靜態初始化程序、 實例初始化程序中的if、while、do、for、?:、catch、switch、case等語句,以及&&和||運算符的數量所測量 --> <module name="CyclomaticComplexity"> <property name="severity" value="ignore"/> </module> <!-- =============雜項檢查============= --> <!-- 檢查數組定義的風格。有的開發者使用Java風格:public static void main(String[] args);有的開發者使用C風格:public static void main(String args[]) --> <module name="ArrayTypeStyle"> <property name="javaStyle" value="true"/> </module> <!-- 檢查方法/構造器的參數是否是final的。這項檢查會忽略接口方法的檢查 --> <module name="FinalParameters"/> <!-- 檢查Java代碼的縮進是否正確 basicOffset: 定義代碼體相對於所屬的代碼體的縮進量 braceAdjustment: 定義括號的縮進量 caseIndent: 定義case的縮進量 --> <module name="Indentation"> <property name="basicOffset" value="4"/> <property name="braceAdjustment" value="0"/> <property name="caseIndent" value="4"/> </module> <!-- 檢查文件是否以新行結束 --> <module name="NewlineAtEndOfFile"/> <!-- 這是一項FileSetCheck檢查,通過檢查關鍵字的一致性屬性文件,它可以確保代碼的語言轉換的正確性 --> <module name="Translation"> <property name="severity" value="info"/> </module> <!-- 檢查源碼中是否有未注釋的main()方法(調試的殘留物) excludedClasses: 定義可以帶main方法的類所匹配的名字形式 --> <module name="UncommentedMain"> <property name="excludedClasses" value="^$"/> </module> <!-- 檢查long類型的常量在定義時是否由大寫的“L”開頭 --> <module name="UpperEll"/> </module> </module>