Checkstyle

Google Style

Google Style 配置

  • Eclipse

    1
    Window > Preferences > Java > Code Style > Formatter > Import...
  • IntelliJ

    1
    File > Settings... > Editor > Code Style > Java > Manage... > Import... > Eclipse XML Profile

Checkstyle

Checkstyle 自定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE module PUBLIC
"-//Puppy Crawl//DTD Check Configuration 1.3//EN"
"http://www.puppycrawl.com/dtds/configuration_1_3.dtd">

<module name = "Checker">

<property name="charset" value="UTF-8"/>
<property name="severity" value="warning"/>

<module name="NewlineAtEndOfFile">
<property name="fileExtensions" value="java,properties,xml"/>
</module>

<!-- 不允许使用TAB缩进 -->
<module name="FileTabCharacter">
<property name="eachLine" value="true"/>
<message key="containsTab" value="本行不能包含tab字符."/>
</module>

<!-- 检查每个java package中是否包含java注释文件 -->
<module name="JavadocPackage">
<property name="allowLegacy" value="true"/>
<message key="javadoc.packageInfo" value="package中需包含有package-info.java注释文件."/>
</module>

<module name="TreeWalker">

<!-- 修饰符顺序检测 -->
<module name="ModifierOrder">
<message key="mod.order" value="''{0}'' 修饰符顺序错误."/>
<message key="annotation.order" value="'{0}'' 注释修饰符不能在非注释修饰符前面."/>
</module>

<!-- 缩进风格 -->
<module name="Indentation">
<property name="severity" value="error"/>
<property name="basicOffset" value="4"/>
<message key="indentation.error" value="你缩进了{1}个空格,正确应该缩进 {2}个空格."/>
<message key="indentation.child.error" value="你缩进了{1}个空格,正确应该缩进 {2}个空格."/>
</module>

<!-- 页宽 -->
<module name="LineLength">
<property name="max" value="120"/>
<message key="maxLineLen" value="行字符数超过120个."/>
</module>

<!-- 操作符换行策略检查 -->
<module name="OperatorWrap">
<property name="severity" value="error"/>
<property name="option" value="nl"/>
<property name="tokens" value="ASSIGN,BAND,BOR,DIV,EQUAL,GE,GT,LAND,LE,LOR,LT,MINUS_ASSIGN,MOD,MOD_ASSIGN,NOT_EQUAL,PLUS,PLUS_ASSIGN,QUESTION,STAR,STAR_ASSIGN"/>
</module>
<module name="ParenPad">
<property name="severity" value="error"/>
<property name="tokens" value="CTOR_CALL,METHOD_CALL,SUPER_CTOR_CALL"/>
<message key="ws.followed" value="''{0}'' 后面有空格."/>
<message key="ws.preceded" value="''{0}'' 前面有空格."/>
</module>
<module name="TypecastParenPad">
<property name="severity" value="error"/>
<property name="tokens" value="RPAREN,TYPECAST"/>
<message key="ws.followed" value="''{0}''后面多一个空格."/>
<message key="ws.preceded" value="''{0}''前面多一个空格."/>
</module>
<module name="WhitespaceAfter">
<property name="severity" value="error"/>
<property name="tokens" value="COMMA,SEMI"/>
<message key="ws.notFollowed" value="''{0}''后面多一个空格."/>
</module>
<module name="WhitespaceAround">
<property name="severity" value="error"/>
<property name="tokens" value="RCURLY,LITERAL_ASSERT,LITERAL_ASSERT,LITERAL_CATCH,LITERAL_DO,LITERAL_ELSE,LITERAL_FINALLY,LITERAL_FOR,LITERAL_IF,LITERAL_RETURN,LITERAL_SYNCHRONIZED,LITERAL_TRY,LITERAL_WHILE"/>
<property name="allowEmptyConstructors" value="true"/>
<property name="allowEmptyMethods" value="true"/>
<message key="ws.notPreceded" value="''{0}'' 关键字前少一个空格."/>
<message key="ws.notFollowed" value="''{0}'' 关键字后少一个空格."/>
</module>

<!-- 每行语句数量-->
<module name="OneStatementPerLine">
<metadata name="net.sf.eclipsecs.core.comment" value="Coding Problems-> Only one statement per line allowed" />
<message key="multiple.statements.line" value="禁止一行有多句代码." />
</module>

<!-- 每行变量声明数量-->
<module name="MultipleVariableDeclarations">
<property name="severity" value="error"/>
<message key="multiple.variable.declarations.comma" value="每一个变量的定义必须在它的声明处且在同一行."/>
<message key="multiple.variable.declarations" value="每一行只能定义一个变量."/>
</module>

<module name="RightCurly">
<property name="option" value="alone"/>
<property name="severity" value="error"/>
</module>

<module name="LeftCurly">
<property name="severity" value="error"/>
<message key="line.previous" value="左侧大括号没有放在前一行代码的行尾."/>
</module>

<module name="NeedBraces">
<message key="needBraces" value="''{0}'' 结构没有用大括号 '''{}'''"/>
</module>

<!-- 对类和接口的注释检查 -->
<module name="JavadocType">
<property name="severity" value="error"/>
<message key="type.missingTag" value="Javadoc 类型的注释丢失 {0} 标签."/>
<message key="javadoc.missing" value="缺少 Javadoc 注释."/>
<message key="javadoc.unusedTagGeneral" value="未使用过的 Javadoc 标签."/>
<message key="javadoc.unusedTag" value="未使用过的 {0} 标签for ''{1}''."/>
<message key="type.tagFormat" value="Javadoc 类型标签 {0}必须匹配模式 ''{1}''."/>
</module>

<!-- 对public protect private修饰的变量注释检查 -->
<module name="JavadocVariable">
<property name="severity" value="error"/>
<property name="scope" value="public"/>
<message key="javadoc.missing" value="变量注释:缺少Javadoc注释."/>
</module>
<module name="JavadocVariable">
<property name="severity" value="error"/>
<property name="scope" value="protected"/>
<message key="javadoc.missing" value="变量注释:缺少Javadoc注释."/>
</module>
<module name="JavadocVariable">
<property name="severity" value="error"/>
<message key="javadoc.missing" value="变量注释:缺少Javadoc注释."/>
</module>

<!-- 检查所有方法的javadoc(可以不声明RuntimeException) -->
<module name="JavadocMethod">
<property name="allowUndeclaredRTE" value="true"/>
<!-- 允许get set 方法没有注释 -->
<property name="allowMissingPropertyJavadoc" value="true"/>
<message key="javadoc.missing" value="方法注释:缺少Javadoc注释."/>
</module>

<!-- 包名命名规范 -->
<module name="PackageName">
<!-- <property name="format" value="^[a-z]+(\.[a-z][a-z0-9]*)*$"/> -->
<property name="format" value="^mo\.gov\.dsat\.vss+(\.[a-z]+)+$"/>
<message key="name.invalidPattern" value="包名 ''{0}'' 不符合 mo.gov.dsat.vss.模块名 命名规范."/>
</module>

<!-- 类的命名,匹配规则默认:(^[A-Z][a-zA-Z0-9]*$),必须以大写字母开始 -->
<module name="TypeName">
<property name="tokens" value="CLASS_DEF"/>
<message key="name.invalidPattern" value="类名 ''{0}''没有通过大驼峰命名法命名,具体名称应使用意义完整的英文描述."/>
</module>

<!-- 接口命名,匹配规则默认:(^[A-Z][a-zA-Z0-9]*$),必须以大写字母开始 -->
<module name="TypeName">
<property name="tokens" value="INTERFACE_DEF"/>
<message key="name.invalidPattern" value="接口名 ''{0}''没有通过大驼峰命名法命名,具体名称应使用意义完整的英文描述."/>
</module>

<!-- 方法名命名 -->
<module name="MethodName">
<property name="severity" value="error"/>
<property name="format" value="(^[a-z][a-zA-Z0-9]*$)"/>
<message key="name.invalidPattern" value="方法名 ''{0}''没有通过小驼峰命名法命名,具体名称应使用意义完整的英文描述."/>
</module>

<!-- 局部变量命名 -->
<module name="LocalVariableName">
<property name="format" value="(^[a-z][a-zA-Z0-9]*$)"/>
<message key="name.invalidPattern" value="变量名 ''{0}''没有通过小驼峰命名法命名,具体名称应使用意义完整的英文描述."/>
</module>

<!-- 局部的final变量,包括catch中的参数的检查 -->
<module name="LocalFinalVariableName">
<property name="severity" value="error"/>
<message key="name.invalidPattern" value="变量名 ''{0}''没有通过小驼峰命名法命名,具体名称应使用意义完整的英文描述."/>
</module>

<!-- 变量命名 -->
<module name="MemberName">
<message key="name.invalidPattern" value="变量名 ''{0}''没有通过小驼峰命名法命名,具体名称应使用意义完整的英文描述."/>
</module>

<!-- 静态变量命名 -->
<module name="StaticVariableName">
<message key="name.invalidPattern" value="变量名 ''{0}''没有通过小驼峰命名法命名,具体名称应使用意义完整的英文描述."/>
</module>

<!-- 数组变量命名 -->
<module name="ArrayTypeStyle">
<property name="severity" value="error"/>
<message key="array.type.style" value="数组定义没有采取int[] index这种方式."/>
</module>

<!-- 常量命名 -->
<module name="ConstantName">
<property name="severity" value="error"/>
<message key="name.invalidPattern" value="常量 ''{0}'' 常量名违反编码规范."/>
</module>

<!-- import语句不使用通配符 -->
<module name="AvoidStarImport">
<property name="severity" value="error"/>
<message key="import.avoidStar" value="引用包时不能使用*号."/>
</module>

<!-- 魔法数检测 -->
<module name="MagicNumber">
<property name="severity" value="error"/>
<message key="magic.number" value="''{0}'' 是一个魔法数(即常数)."/>
</module>

<!-- 多余的关键字,包含不适用this作为关键字 -->
<module name="RedundantModifier">
<message key="redundantModifier" value="''{0}'' 多余的修饰符."/>
</module>

<!-- 重载父类方法 -->
<module name="MissingOverride">
<message key="annotation.missing.override" value="重载方法缺少@Override." />
<message key="tag.not.valid.on" value="注释-> Javadoc {0}标签在这个位置是无效的." />
</module>

<!-- 判断语句使用 -->
<module name="SimplifyBooleanExpression">
<property name="severity" value="error"/>
<message key="simplify.expression" value="存在布尔冗余."/>
</module>

<!-- 检查switch语句是否忘记了default标签 -->
<module name="MissingSwitchDefault">
<property name="severity" value="error"/>
<message key="missing.switch.default" value="switch 语句后边没有 default 语句."/>
</module>

<!-- 检查switch语句中default标签的顺序 -->
<module name="DefaultComesLast">
<property name="severity" value="error"/>
<message key="default.comes.last" value="建议Default 放在 switch 语句的最后."/>
</module>

<!-- 禁止使用System.out.println -->
<module name="Regexp">
<property name="format" value="System\.out\.println"/>
<property name="message" value="不要使用 System.out.println 进行控制台打印,应该使用日志工具类(如:log4j)进行统一记录或者打印."/>
<property name="illegalPattern" value="true"/>
</module>

<!-- 禁止使用System.err.println -->
<module name="Regexp">
<property name="format" value="System\.err\.println"/>
<property name="message" value="不要使用 System.err.println 进行控制台打印,应该使用日志工具类(如:log4j)进行统一记录或者打印."/>
<property name="illegalPattern" value="true"/>
</module>

<!-- 不允许用main方法测试 -->
<module name="UncommentedMain"/>

<!-- 检查是否应该使用括号的地方没有加括号 -->
<module name="NeedBraces"/>

</module>
</module>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<profiles>
<profile>
<id>checkstyle</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<version>2.9.1</version>
<executions>
<execution>
<id>checkstyle</id>
<phase>validate</phase>
<goals>
<goal>check</goal>
</goals>
<configuration>
<failOnViolation>false</failOnViolation>
</configuration>
</execution>
</executions>
<configuration>
<configLocation>${checkstyle.config.location}</configLocation>
<suppressionsLocation>${checkstyle.suppressions.location}</suppressionsLocation>
</configuration>
</plugin>
</plugins>
</build>
<properties>
<checkstyle.config.location>
${basedir}/src/test/resources/checkstyle/custom_checks.xml
</checkstyle.config.location>
<checkstyle.suppressions.location>
${basedir}/src/test/resources/checkstyle/checkstyle_suppressions.xml
</checkstyle.suppressions.location>
</properties>
</profile>
</profiles>