天天看點

自定義checkstyle

定制檢查:Checkstyle沒有圖形化的定制器,是以需要手工修改配置檔案。比如,我們的代碼需要符合下列規則:

*

長度方面:檔案長度不超過1500行,每行不超過120個字,方法不超過60行.

*

命名方面:類名不能小寫開頭,方法名不能大寫開頭,常量不能有小寫字母。

*

編碼方面:不能用魔法數(Magic Number),if最多嵌套3層。

那麼,我們的檢查配置檔案(如命名成 my_check.xml )應該是這樣的:

下面是對具體的check的描述。這些check可以被分為了15類,如下所示:

===== CHECK STYLE ========

----- Annotations -------- JDK5中的Annotation相關(未展開)

----- Block Checks ------- 代碼塊相關

----- Class Design ------- 類設計相關

----- Coding ------------- 編碼相關

----- Duplicate Code ----- 備援代碼

----- Headers ------------ 源檔案的頭

----- Imports ------------ 引入包相關

----- Javadoc Comments --- JavaDoc相關

----- Metrics ------------ 複雜度分析

----- Miscellaneous ------ 其它

----- Modifiers ---------- 修飾符相關

----- Naming Conventions - 命名規範

----- Regexp ------------- 正規表達式相關

----- Size Violations ---- 檔案大小等相關

----- Whitespace --------- 空格處理相關

==========================

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE module PUBLIC

"-//Puppy Crawl//DTD Check Configuration 1.2//EN"

"http://www.puppycrawl.com/dtds/configuration_1_2.dtd">

<module name="Checker">

<module name="TreeWalker">

<!-- 長度方面的檢查 -->

<!-- 檔案長度不超過1500行 -->

<module name="FileLength">

<property name="max" value="1500"/>

</module>

<!-- 每行不超過120個字-->

<module name="LineLength">

<property name="max" value="120"/>

</module>

<!-- 方法不超過60行 -->

<module name="MethodLength">

<property name="tokens" value="METHOD_DEF"/>

<property name="max" value="60"/>

</module>

<!-- 命名方面的檢查,它們都使用了Checkstyle預設的規則。 -->

<!-- 類名(class 或interface) 的檢查 -->

<module name="TypeName"/>

<!-- 方法名的檢查 -->

<module name="MethodName"/>

<!-- 常量名的檢查 -->

<module name="ConstantName"/>

<!-- 編碼方面的檢查 -->

<!-- 不能用魔法數 -->

<module name="MagicNumber"/>

<!-- if最多嵌套3層 -->

<module name="NestedIfDepth">

<property name="max" value="3"/>

</module>

</module>

</module>

可以看出,想增加一個檢查,就是增加一個<module/>結點。具體的結點内容在後面的文檔都會寫明。dds  

1. <!DOCTYPE module PUBLIC 

  2.     "-//Puppy Crawl//DTDCheck Configuration 1.2//EN" 

  3.    "http://www.puppycrawl.com/dtds/configuration_1_2.dtd"> 

   4.<module name="Checker"> 

  5.  

  6.     <!-- 

  7.         重複代碼的檢查,超過8行就認為重複,UTF-8格式 本檢查一定要放在"TreeWalker"節點前,否則在 

  8.         Checkclipse中會無法使用。(在ant下可以) 

  9.     --> 

 10.     <modulename="StrictDuplicateCode"> 

 11.         <propertyname="min" value="8" /> 

 12.         <propertyname="charset" value="UTF-8" /> 

 13.     </module> 

 14.  

 15.     <modulename="TreeWalker"> 

  16.  

 17.         <!-- javadoc的檢查--> 

 18.         <!-- 檢查所有的interface和class--> 

 19.         <modulename="JavadocType" /> 

 20.  

 21.         <!-- 命名方面的檢查,它們都使用了Sun官方定的規則。 --> 

 22.         <!-- 局部的final變量,包括catch中的參數的檢查--> 

 23.         <modulename="LocalFinalVariableName" /> 

 24.         <!-- 局部的非final型的變量,包括catch中的參數的檢查--> 

 25.         <modulename="LocalVariableName" /> 

 26.         <!-- 包名的檢查(隻允許小寫字母) --> 

 27.         <modulename="PackageName"> 

 28.             <propertyname="format" value="^[a-z]+(\.[a-z][a-z0-9]*)*$"/> 

 29.         </module> 

 30.         <!-- 僅僅是static型的變量(不包括staticfinal型)的檢查 --> 

 31.         <modulename="StaticVariableName" /> 

 32.         <!-- 類型(Class或Interface)名的檢查--> 

  33.         <module name="TypeName"/> 

 34.         <!-- 非static型變量的檢查--> 

 35.         <modulename="MemberName" /> 

 36.         <!-- 方法名的檢查--> 

 37.         <modulename="MethodName" /> 

 38.         <!-- 方法的參數名--> 

 39.         <module name="ParameterName" /> 

 40.         <!-- 常量名的檢查--> 

 41.         <modulename="ConstantName" /> 

 42.  

 43.         <!-- import方面的檢查--> 

 44.         <!-- import中避免星号"*"--> 

 45.         <modulename="AvoidStarImport" /> 

 46.         <!-- 

 47.             沒用的import檢查,比如:1.沒有被用到2.重複的3.importjava.lang的4.import 

 48.             與該類在同一個package的 

 49.         --> 

 50.         <modulename="UnusedImports" /> 

 51.  

 52.  

 53.         <!-- 長度方面的檢查--> 

 54.         <!-- 檔案長度不超過1500行 --> 

 55.         <modulename="FileLength"> 

 56.             <propertyname="max" value="1500" /> 

 57.         </module> 

 58.         <!-- 每行不超過120個字--> 

 59.         <modulename="LineLength"> 

 60.             <propertyname="max" value="120" /> 

 61.         </module> 

 62.         <!-- 方法不超過30行 --> 

 63.         <modulename="MethodLength"> 

 64.             <propertyname="tokens" value="METHOD_DEF" /> 

 65.             <propertyname="max" value="30" /> 

 66.         </module> 

 67.         <!-- 方法的參數個數不超過3個。 并且不對構造方法進行檢查--> 

 68.         <modulename="ParameterNumber"> 

 69.             <propertyname="max" value="3" /> 

 70.             <propertyname="tokens" value="METHOD_DEF" /> 

  71.         </module> 

 72.  

 73.         <!-- 空格檢查  --> 

 74.         <!-- 允許方法名後緊跟左邊圓括号"("--> 

 75.         <modulename="MethodParamPad" /> 

 76.         <!-- 在類型轉換時,不允許左圓括号右邊有空格,也不允許與右圓括号左邊有空格 --> 

 77.         <modulename="TypecastParenPad" /> 

 78.         <!-- 不允許使用"tab"鍵  --> 

 79.         <modulename="TabCharacter" /> 

 80.  

 81.         <!-- 關鍵字--> 

 82.         <!-- 

 83.             每個關鍵字都有正确的出現順序。比如 public static final XXX 是對一個常量的聲明。如果使用static 

 84.             public final 就是錯誤的 

 85.         --> 

 86.         <modulename="ModifierOrder" /> 

 87.         <!-- 多餘的關鍵字--> 

 88.         <modulename="RedundantModifier" /> 

 89.  

 90.         <!-- 對區域的檢查--> 

 91.         <!-- 不能出現空白區域--> 

 92.         <modulename="EmptyBlock" /> 

 93.         <!-- 所有區域都要使用大括号。--> 

 94.         <modulename="NeedBraces" /> 

 95.         <!-- 多餘的括号--> 

 96.         <modulename="AvoidNestedBlocks"> 

 97.             <propertyname="allowInSwitchCase" value="true" /> 

 98.         </module> 

 99.  

 100.        <!-- 編碼方面的檢查 --> 

 101.        <!-- 不許出現空語句 --> 

 102.        <module name="EmptyStatement" /> 

 103.        <!-- 每個類都實作了equals()和hashCode() --> 

 104.        <module name="EqualsHashCode" /> 

 105.        <!-- 不許使用switch,"a++"這樣可讀性很差的代碼 --> 

 106.        <module name="IllegalToken" /> 

 107.        <!-- 不許内部指派 --> 

 108.        <module name="InnerAssignment" /> 

 109.        <!-- 絕對不能容忍魔法數 --> 

 110.        <module name="MagicNumber"> 

 111.             <propertyname="tokens" value="NUM_DOUBLE, NUM_INT" /> 

 112.        </module> 

 113.        <!-- 循環控制變量不能被修改 --> 

 114.        <module name="ModifiedControlVariable" /> 

 115.        <!-- 多餘的throw --> 

 116.        <module name="RedundantThrows" /> 

 117.        <!-- 不許使用未被簡化的條件表達式 --> 

 118.        <module name="SimplifyBooleanExpression" /> 

 119.        <!-- 不許使用未被簡化的布爾傳回值 --> 

 120.        <module name="SimplifyBooleanReturn" /> 

 121.        <!-- String的比較不能用!= 和 == --> 

 122.        <module name="StringLiteralEquality" /> 

 123.        <!-- if最多嵌套3層 --> 

 124.        <module name="NestedIfDepth"> 

 125.             <property name="max"value="3" /> 

 126.        </module> 

 127.        <!-- try最多被嵌套2層 --> 

 128.        <module name="NestedTryDepth"> 

 129.             <property name="max"value="2" /> 

 130.        </module> 

 131.        <!-- clone方法必須調用了super.clone() --> 

 132.        <module name="SuperClone" /> 

 133.        <!-- finalize 必須調用了super.finalize() --> 

 134.        <module name="SuperFinalize" /> 

 135.        <!-- 不能catch java.lang.Exception --> 

 136.        <module name="IllegalCatch"> 

 137.             <property name="illegalClassNames"value="java.lang.Exception" /> 

 138.        </module> 

 139.        <!-- 確定一個類有package聲明 --> 

 140.        <module name="PackageDeclaration" /> 

 141.        <!-- 一個方法中最多有3個return --> 

 142.        <module name="ReturnCount"> 

 143.             <property name="max"value="3" /> 

 144.             <propertyname="format" value="^$" /> 

 145.        </module> 

 146.        <!-- 

 147.             根據 Sun 編碼規範, class 或 interface 中的順序如下:1.class 聲明。首先是 public, 

 148.            然後是protected , 然後是 packagelevel (不包括access modifier )最後是private . 

 149.             (多個class放在一個java檔案中的情況) 2.變量聲明。 首先是 public, 然後是protected然後是package 

 150.             level (不包括accessmodifier )最後是private . (多個class放在一個java檔案中的情況) 

 151.            3.構造函數 4.方法 

 152.        --> 

 153.        <module name="DeclarationOrder" /> 

 154.        <!-- 不許對方法的參數指派 --> 

 155.        <module name="ParameterAssignment" /> 

 156.        <!-- 確定某個class 在被使用時都已經被初始化成預設值(對象是null,數字和字元是0,boolean 變量是false.) --> 

 157.        <module name="ExplicitInitialization" /> 

 158.        <!-- 不許有同樣内容的String --> 

 159.        <module name="MultipleStringLiterals" /> 

 160.        <!-- 同一行不能有多個聲明 --> 

 161.        <module name="MultipleVariableDeclarations" /> 

 162.        <!-- 不必要的圓括号 --> 

 163.        <module name="UnnecessaryParentheses" /> 

 164.  

 165.        <!-- 各種量度 --> 

 166.        <!-- 布爾表達式的複雜度,不超過3 --> 

 167.        <module name="BooleanExpressionComplexity" /> 

 168.        <!-- 類資料的抽象耦合,不超過7 --> 

 169.        <module name="ClassDataAbstractionCoupling" /> 

 170.        <!-- 類的分散複雜度,不超過20 --> 

 171.        <module name="ClassFanOutComplexity" /> 

 172.        <!-- 函數的分支複雜度,不超過10 --> 

 173.        <module name="CyclomaticComplexity" /> 

 174.        <!-- NPath複雜度,不超過200 --> 

 175.        <module name="NPathComplexity" /> 

 176.  

 177.        <!-- 雜項 --> 

 178.        <!-- 禁止使用System.out.println --> 

 179.        <module name="GenericIllegalRegexp"> 

 180.             <propertyname="format" value="System\.out\.println" /> 

 181.             <propertyname="ignoreComments" value="true" /> 

 182.        </module> 

 183.          

 184.        <!-- 不許使用main方法 --> 

 185.        <module name="UncommentedMain" /> 

 186.        <!-- 檢查并確定所有的常量中的L都是大寫的。因為小寫的字母l跟數字1太象了 --> 

 187.        <module name="UpperEll" /> 

 188.        <!-- 檢查數組類型的定義是String[] args,而不是String args[] --> 

 189.        <module name="ArrayTypeStyle" /> 

 190.         <!-- 

 191.             檢查java代碼的縮進 預設配置:基本縮進 4個空格,新行的大括号:0。新行的case 4個空格。 

 192.        --> 

 193.        <module name="Indentation" /> 

 194.    </module> 

 195.  

 196.    <!-- 檢查翻譯檔案     --> 

 197.    <module name="Translation" /> 

 198.</module> 

繼續閱讀