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