定制檢查: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>