-
Notifications
You must be signed in to change notification settings - Fork 168
/
checkstyle.xml
697 lines (697 loc) · 42.8 KB
/
checkstyle.xml
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
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
<?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="SuppressionFilter">
<property name="file" value="suppressions.xml"/>
</module>
<module name="BeforeExecutionExclusionFileFilter">
<property name="fileNamePattern" value=".*[\\/]src[\\/]test[\\/].*$"/>
</module>
<module name="SuppressWarningsFilter"/>
<!--规则1.1 源文件编码格式(包括注释)必须是UTF-8,ASCII水平空格字符(0x20,即空格)是唯一允许出现的空白字符,制表符不用于缩进-->
<property name="charset" value="UTF-8"/>
<property name="fileExtensions" value="java"/>
<!-- 使用 CHECKSTYLE:OFF and CHECKSTYLE:ON注释内容关闭或者开启某个检查 -->
<module name="SuppressWithPlainTextCommentFilter">
<property name="offCommentFormat" value="CHECKSTYLE\:OFF\:\s*(\w+)"/>
<property name="onCommentFormat" value="CHECKSTYLE\:ON\:\s*(\w+)"/>
<property name="checkFormat" value="$1"/>
</module>
<!-- 规则1.3 避免文件过长,不超过2000行(非空非注释行) -->
<module name="FileLength">
<property name="max" value="2000"/>
</module>
<!-- 规则3.3 使用空格进行缩进,每次缩进4个空格: 不允许用Tab -->
<module name="FileTabCharacter"/>
<!-- 规则1.2 华为版权检查-->
<!-- module name="RegexpSingleline">
<property name="format" value="^ \* Copyright \(c\) Huawei Technologies Co., Ltd. [\d]{4}(\-[\d]{4})\. All rights reserved\.$"/>
<property name="minimum" value="1"/>
<property name="maximum" value="1"/>
<property name="message" value="编程规范-规则2.4: 华为版权缺失或者格式不正确"/>
<property name="severity" value="error"/>
</module-->
<module name="RegexpSingleline">
<property name="format" value="^\s\*\s@since\s\d{4}-\d{2}-\d{2}$"/>
<property name="minimum" value="1"/><property name="maximum" value="1"/>
<property name="severity" value="error"/>
<property name="message" value="编程规范-规则2.4:顶层public类javadoc缺少@since或格式不正确(正确格式示例:@since 2019-01-22)"/>
</module>
<!-- 建议1.1 含有集合意义的属性,名称尽量包含复数形式
<module name="RegexpSingleline">
<property name="severity" value="warning"/>
<property name="format" value="Set(<\w+>)?\s.*(?<!Set|SET|s|S)\s="/>
<property name="message" value="编程规范-建议1.1 含有集合意义的属性,名称尽量包含复数形式"/>
</module>
<module name="RegexpSingleline">
<property name="severity" value="warning"/>
<property name="format" value="Set(<\w+>)?\s\w+(?<!Set|SET|s|S);$"/>
<property name="message" value="编程规范-建议1.1 含有集合意义的属性,名称尽量包含复数形式"/>
</module>
<module name="RegexpSingleline">
<property name="severity" value="warning"/>
<property name="format" value="List(<\w+>)?\s.*(?<!List|LIST|s|S)\s="/>
<property name="message" value="编程规范-建议1.1 含有集合意义的属性,名称尽量包含复数形式"/>
</module>
<module name="RegexpSingleline">
<property name="severity" value="warning"/>
<property name="format" value="List(<\w+>)?\s\w+(?<!List|LIST|s|S);$"/>
<property name="message" value="编程规范-建议1.1 含有集合意义的属性,名称尽量包含复数形式"/>
</module>
<module name="RegexpSingleline">
<property name="severity" value="warning"/>
<property name="format" value="Map(<.+>)?\s.*(?<!Map|MAP|s|S)\s="/>
<property name="message" value="编程规范-建议1.1 含有集合意义的属性,名称尽量包含复数形式"/>
</module>
<module name="RegexpSingleline">
<property name="severity" value="warning"/>
<property name="format" value="Map(<.+>)?\s\w+(?<!Map|MAP|s|S);$"/>
<property name="message" value="编程规范-建议1.1 含有集合意义的属性,名称尽量包含复数形式"/>
</module>
<module name="RegexpSingleline">
<property name="severity" value="warning"/>
<property name="format" value="\[\]\s.*(?<!Array|ARRAY|s|S)\s="/>
<property name="message" value="编程规范-建议1.1 含有集合意义的属性,名称尽量包含复数形式"/>
</module>
<module name="RegexpSingleline">
<property name="severity" value="warning"/>
<property name="format" value="\[\]\s\w+(?<!Array|ARRAY|s|S);$"/>
<property name="message" value="编程规范-建议1.1 含有集合意义的属性,名称尽量包含复数形式"/>
</module>-->
<!-- 建议1.2 避免使用否定的布尔变量名-->
<module name="RegexpSingleline">
<property name="severity" value="warning"/>
<property name="format" value="(boolean|Boolean)\s(\bisNot?|\bmIsNot?)[A-Z](a-zA-Z0-9=;,\s)*"/>
<property name="message" value="编程规范-建议1.1 避免使用否定的布尔变量名"/>
</module>
<!-- 方法暂时不感知
<module name="RegexpSingleline"><property name="format" value="(boolean|Boolean)\s[^iIe][^sSq][^u]?[^a]?[^l]?[^s]?"/><property name="message" value="编程规范-建议1.2 布尔变量名或方法以is开头"/></module>-->
<module name="RegexpSingleline">
<property name="severity" value="warning"/>
<property name="format" value="(boolean|Boolean)\s((m[^I])|(mI[^s])|(s[^I])|(sI[^s])|[^msiI]|([iI][^sS]))(?![a-zA-Z0-9=;,\s]*\()"/>
<property name="message" value="编程规范-建议1.2 布尔变量名或方法以is开头(has have does do did will should can may must could等疑问助动词也可以,Android允许m作为疑问助动词前缀)"/>
<property name="maximum" value="15"/>
</module>
<module name="RegexpSingleline">
<property name="severity" value="warning"/>
<property name="format" value="(boolean|Boolean)\s(((is)[^A-Z0-9])|(IS[^A-Z_0-9]+))"/>
<property name="message" value="编程规范-建议1.2 布尔变量名以is后面字符必须是大写字母或者数字"/>
</module>
<!-- 规则2.5 注释符与注释内容间要有1空格;右置注释与前面代码至少1空-->
<module name="RegexpSingleline">
<property name="format" value="[^:]//[^\s]"/>
<property name="message" value="编程规范-规则2.6: 请添加空格(单行注释符与注释内容间以空格分割)"/>
</module>
<!-- 检查类似:2):// 特殊场景,case xxx:后面加了注释 -->
<module name="RegexpSingleline">
<property name="format" value="case [\s\S]+[:]//"/>
<property name="message" value="编程规范-规则2.6: 请添加空格(单行注释符与注释内容间以空格分割)"/>
</module>
<!-- 检查类似:/*XXXX*/ 右边无空格注释-->
<module name="RegexpSingleline">
<property name="format" value="(\*)+[\u4E00-\u9FA5A-Za-z0-9_]"/>
<property name="message" value="编程规范-规则2.6: 请添加空格(单行注释符与注释内容间以空格分割)"/>
</module>
<module name="RegexpSingleline">
<property name="format" value="[\u4E00-\u9FA5A-Za-z0-9_]((\*)+)/"/>
<property name="message" value="编程规范-规则2.6: 请添加空格(单行注释符与注释内容间以空格分割)"/>
</module>
<!--规则2.4 注释符与注释内容间要有1空格;右置注释与前面代码至少1空格-->
<module name="RegexpSingleline">
<property name="format" value=".*;//"/>
<property name="message" value="编程规范-规则2.6:请添加空格(分号和单行注释符间以空格分割)"/>
</module>
<module name="RegexpSingleline">
<property name="format" value="^\s*//[^\u4e00-\u9fa5]*(\s*;|\{|\})$"/>
<property name="message" value="编程规范-规则2.7 : 不用的代码段直接删除,不要注释掉"/>
</module>
<!-- 建议4.3 基本类型优于包装类型,注意合理使用包装类型 (包装类型只能用于泛型、集合中元素、反射)-->
<module name="RegexpSingleline">
<property name="severity" value="warning"/>
<property name="format" value="\s+(Byte|Short|Integer|Long|Float|Double|Character|Boolean)\s+"/>
<property name="message" value="编程规范-建议4.2: 基本类型优于包装类型,注意合理使用包装类型"/>
<property name="maximum" value="5"/>
</module>
<!-- 规则7.7 非仅限于中文区销售产品禁止用中文打印日志 -->
<module name="RegexpSingleline">
<property name="format" value="(LOG|LOGGER|log|logger)\.(fatal|error|warn|info|debug).+[\u4e00-\u9fa5]+"/>
<property name="message" value="编程规范-规则7.7: 禁止用中文打印日志"/>
</module>
<module name="RegexpSingleline">
<property name="format" value="^\s*return null;\s*$"/>
<property name="message" value="建议不要返回null! 1)编程规范-建议5.5: 集合请返回Collections.emptyXXX() 2)编程规范-建议8.6.2: 其他请使用JAVA 8 Optional特性代替"/>
</module>
<module name="RegexpSingleline">
<property name="severity" value="warning"/>
<property name="format" value="\s+$"/>
<property name="message" value="编程规范-建议3.7 行末或空行不能有空格, 请去除多余空格"/>
</module>
<module name="RegexpSingleline">
<property name="severity" value="warning"/>
<property name="format" value="[A-Za-z0-9=+-;:\?]\s{2,}[\u4e00-\u9fa5A-Za-z0-9=+-:\?]"/>
<property name="message" value="编程规范-建议3.8 禁止插入空格水平对齐(包括多余括号)。"/>
</module>
<!--
HashMap/HashSet/LinkedHashSet:已知元素个数填实际个数,未知填默认值16;
StringBuilder/StringBuffer:构造数据填写length方法获得的实际值(默认16个字节)
ArrayList:已知元素个数填实际个数(默认值0)
ConcurrentHashMap: 已知元素个数填实际个数(分配的是指定的2倍);
-->
<!--建议8.7.2 初始化集合时,给出初始化大小
<module name="RegexpSingleline">
<property name="severity" value="warning"/>
<property name="format" value="new\s+(ArrayList|StringBuilder|StringBuffer|HashMap|HashSet|LinkedHashSet|ConcurrentHashMap|LinkedHashMap)(<.*>\(\)|\(\)|\("{2}\))"/>
<property name="message" value="编程规范-建议8.7.2 : 初始化集合时,指定初始化大小"/>
</module>-->
<!-- 规则3.1 在条件语句和循环块中必须使用大括号 条件表达式用圆括号分组:方法调用不需要加圆括号
<module name="RegexpSingleline"><property name="format" value="(&{2}|\|{2})\s*[^(]*[\w\.]*\s*(<|>|>=|<=|==|!=)+"/><property name="message" value="编程规范-建议3.6 :超过1个的条件表达式应当用小圆括号分组"/></module><module name="RegexpSingleline"><property name="format" value="(<|>|>=|<=|==|!=)+\s*[\w\.]*[^)]\s*(&{2}|\|{2})"/><property name="message" value="编程规范-建议3.6 :超过1个的条件表达式应当用小圆括号分组"/></module><module name="RegexpSingleline"><property name="format" value="(<|>|>=|<=|==|!=)+\s*[\w\.]+[^)]\s*\?.*:"/><property name="message" value="编程规范-建议3.6 :超过1个的条件表达式应当用小圆括号分组"/></module>-->
<!-- 规则4.1 不能用浮点数作为循环变量(循环变量在for条件之外声明无法检查)-->
<module name="RegexpSingleline">
<property name="format" value="((<|>|>=|<=|==|!=)\s*(Double\.NaN|Float\.NaN))|((Double\.NaN|Float\.NaN)\s*(<|>|>=|<=|==|!=))"/>
<property name="message" value="编程规范-规则4.4 禁止尝试与NaN进行比较运算,相等操作使用Double或Float的isNaN方法"/>
</module>
<module name="RegexpSingleline">
<property name="format" value="^.*for\s+[(](float|double).*$"/>
<property name="message" value="编程规范-规则4.1 :不能使用浮点数做循环变量"/>
</module>
<!--
<module name="RegexpSingleline"><property name="format" value="^.*for\s+[(](\s*|\w+\s*\w+\s*=\s*0)\s*;.*;(\s*\)|\s*\w+\s*\+\+|\s*\+\+|\s*\w+\s*=(\s*\w+\s*\+\s*(1)|\s*(1)\s*+))"/><property name="message" value="编程规范-规则8.3.1 :无需索引时采用for-each代替传统的for循环"/></module>-->
<!-- 确实需要long对象时声明为long并已L结尾,否则使用暂用内存更少的int类型-->
<module name="RegexpSingleline">
<property name="format" value="long\s*\w+\s*=\s*\d[\d\*\s]*\s*;"/>
<property name="message" value="编程规范-规则3.11: 数字字面量以大写字母为后缀(long类型变量请显示填写L,或者改为int类型)"/>
</module>
<module name="RegexpSingleline">
<property name="severity" value="warning"/>
<property name="format" value="\([a-zA-Z\s,<>\\.]+\.{3}[a-zA-Z\s,<>\\.]*\)"/>
<property name="message" value="编程规范-建议5.3 谨慎使用可变数量参数的方法。"/>
</module>
<module name="RegexpSingleline">
<property name="severity" value="warning"/>
<property name="format" value="\.ordinal\(\)"/>
<property name="message" value="编程规范-建议8.6.3 避免枚举常量序号的产生依赖于ordinal()方法。"/>
</module>
<!-- <module name="RegexpSingleline">
<property name="severity" value="warning"/>
<property name="format" value="native [a-z].*;$"/>
<property name="message" value="编程规范-建议8.8.1 谨慎地使用本地方法。"/>
</module>-->
<module name="RegexpSingleline">
<property name="format" value="\w{65,}"/>
<property name="message" value="编程规范-规则1.2 名字长度不能超过64个字符。"/>
</module>
<module name="RegexpSingleline">
<property name="format" value="^((?!for).)*(\s[a-z](\s=|;))((?!for).)*$"/>
<property name="message" value="编程规范-规则1.2 名字长度至少2个字符(循环变量、异常变量e当作误报忽略)。"/>
</module>
<module name="RegexpSingleline">
<property name="format" value=" [!=]= (false|true)"/>
<property name="message" value="编程规范-规则8.3.1 冗余不简洁"/>
</module>
<module name="RegexpSingleline">
<property name="format" value="(false|true) [!=]= "/>
<property name="message" value="编程规范-规则8.3.1 冗余不简洁"/>
</module>
<module name="RegexpSingleline">
<property name="format" value="^\s*\*\s*@apiNote\s*$"/>
<property name="message" value="编程规范-规则2.3 推荐使用JDK1.8新的tag:@implSpec,@apiNote和@implNote,如果确实不需要请删除tag"/>
</module>
<module name="RegexpSingleline">
<property name="format" value="\.toArray\([\s\w]+\[[^0]\]"/>
<property name="message" value="编程规范-规则8.7.1 将集合转为数组时使用toArray()方法且不带参数或者参数是类型相同零长度的数组"/>
</module>
<!-- 规则7.1 不要通过一个空的catch块忽略异常-->
<module name="RegexpMultiline">
<property name="format" value="catch\s+[(][^)]*[)]\s+[{]\s+[}]"/>
<property name="message" value="编程规范-规则7.1 : 不要通过一个空的catch块忽略异常"/>
</module>
<!-- 规则7.6 日志应分等级,对info及以下,使用条件形式或者使用占位符的方式 -->
<module name="RegexpMultiline">
<property name="format" value="(LOG|LOGGER|log|logger)\.(fatal|error|warn|info|debug)\((([^"].+)|".+"[^,])\s*(.*)\+"/>
<property name="message" value="编程规范-规则7.6 : 日志应分等级,对info及以下,使用条件形式或者使用占位符的方式"/>
</module>
<!-- 只能检查整个类被注掉的情况 -->
<module name="RegexpMultiline">
<property name="format" value="/[*]+\s+(private|public|protected|static)+[^(]*[(]+[^)]*[)]+\s+[{]+[^\*/]*[\*/]+"/>
<property name="message" value="编程规范-规则2.7 : 不用的代码段直接删除,不要注释掉"/>
</module>
<module name="RegexpMultiline">
<property name="severity" value="warning"/>
<property name="format" value="(null == )|(null != )|([A-Z_]+ (<|>|>=|<=|==|!=)+)"/>
<property name="message" value="编程规范-建议8.2.3 表达式的比较,应当遵循左侧倾向于变化、右侧倾向于不变的原则。"/>
</module>
<module name="RegexpMultiline">
<property name="severity" value="warning"/>
<property name="format" value="(\{\s*[\r\n]\s*[\r\n]\s*[\r\n])|(\s*[\r\n]\s*[\r\n]\s*[\r\n]\s*\})"/>
<property name="message" value="编程规范-建议3.6 大括号内部首尾,不需要空行。"/>
</module>
<module name="RegexpMultiline">
<property name="severity" value="warning"/>
<property name="format" value="(^\s*[\r\n]){2,}"/>
<property name="message" value="编程规范-建议3.6 减少不必要的空行,保持代码紧凑(最多一个空行)。"/>
</module>
<module name="RegexpMultiline">
<property name="format" value="Copyright.*([0-9]{4}).*[\r\n](.*[\r\n])+.*@since\s+\1"/>
<property name="minimum" value="1"/>
<property name="maximum" value="1"/>
<property name="message" value="请检查版权声明中其实年份与@since中年份是否一致"/>
</module>
<!-- 编程规范-规则2.2 -->
<module name="RegexpMultiline">
<property name="format" value="\*/[\r\n]{3,}(public|private|protected)\s+(class|interface|enum)\s"/>
<property name="message" value="编程规范-规则2.2:顶层类(接口或者枚举)头与类(接口或者枚举)首行不应该有空行"/>
</module>
<module name="RegexpMultiline">
<property name="format" value="\*/[\r\n]{3,}(class|interface|enum)\s"/>
<property name="message" value="编程规范-规则2.2:顶层类(接口或者枚举)头与类(接口或者枚举)首行不应该有空行"/>
</module>
<!-- 块首不需要空行
<module name="RegexpMultiline">
<property name="format" value="\{\s*[\r\n]\s*[\r\n]\s*[\r\n]"/>
<property name="message" value="多余空行"/>
</module>
<module name="RegexpMultiline">
<property name="format" value="\s*[\r\n]\s*[\r\n]\s*[\r\n]\s*\}"/>
<property name="message" value="多余空行"/>
</module> -->
<!--规则2.6 注释正文与其下的各个Javadoc tag之间加1个空行-->
<module name="RegexpMultiline">
<property name="format" value="^\s+\*\s+[^\*@]+[\r\n]\s+\*\s*\@"/>
<property name="message" value="编程规范-规则2.6:注释正文与其下的各个Javadoc tag之间加1个空行"/>
</module>
<module name="RegexpMultiline">
<property name="format" value="(;|\})(\n|\r\n) +// "/>
<property name="message" value="编程规范-规则2.6:注释与上面的代码之间加一个空行,但是如果上面已经是本范围(一般是个大括号),则不用加空行"/>
</module>
<!-- 构造函数会出现误报,默认不启用。代码自检时启用
<module name="RegexpMultiline"><property name="format" value="\{\s*[\r\n]\s*[\r\n]\s*\}"/><property name="message" value="必须有实现逻辑"/></module>-->
<!-- 检查耗时较长规则,建议拷贝正则表达式IDE中直接搜索。默认注掉不开启 -->
<!--<module name="RegexpMultiline"><property name="format" value="/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*(([^\u4e00-\u9fa5\s];\s*$)+)([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/"/><property name="message" value="编程规范-规则2.6 : 不用的代码段直接删除,不要注释掉"/></module><module name="RegexpMultiline"><property name="format" value="^(\s*)\}\s*else\s+if.*\{[\r\n](\1\s+.*[\r\n]|\s*[\r\n])+\1\}\s*[\r\n]"/><property name="message" value="编程规范-建议8.3.1 :对于if-else if(后续可能有多个else if)类型的条件判断,最后应该包含一个else分支"/></module><module name="RegexpMultiline"><property name="format" value="(LOG|LOGGER|log|logger)\.(fatal|error|warn|info|debug).*[\r\n]\s+.*[\u4e00-\u9fa5]+"/><property name="message" value="禁止用中文打印日志"/></module> -->
<!-- 安全编程规范开始 -->
<!-- 安全编程规范结束 -->
<!--checkstyle插件版本8.24及以后不能放到TreeWalker里边-->
<module name="LineLength">
<!-- 检查每行,最长120.忽略注释 -->
<property name="ignorePattern" value="^ *\* *[^ ]+$"/>
<property name="max" value="120"/>
</module>
<module name="TreeWalker">
<module name="SuppressionCommentFilter"/>
<module name="SuppressWarningsHolder"/>
<!-- 关于注释:建议代码通过合理的命名、函数短小等方式,让代码有自注释能力,然后配以简要的注释说明,不建议大量的冗余注释 -->
<module name="JavadocType">
<!--检查类和接口的javadoc注释,要有描述、@author/@version等内容
<property name="authorFormat" value="\S"/>-->
<!-- 要有@author -->
<!-- 版本格式暂时不限制
<property name="versionFormat" value="\S"/>-->
</module>
<module name="JavadocMethod">
<!--检查方法和构造函数的javadoc注释-->
<!-- protected以上都检查 ,由于protected以上都可能被他人使用或继承,所以必须给出相应的注释-->
<property name="scope" value="protected"/>
<!-- 不允许没有@param参数说明 -->
<property name="allowMissingParamTags" value="false"/>
<!-- 如果抛出异常不允许没有@throws -->
<property name="validateThrows" value="true"/>
<!-- 如果有返回值,不允许没有@return -->
<property name="allowMissingReturnTag" value="false"/>
</module>
<module name="MissingJavadocMethod">
<property name="scope" value="protected"/>
<property name="allowMissingPropertyJavadoc" value="true"/>
</module>
<module name="JavadocVariable">
<!--检查变量的javadoc-->
<property name="scope" value="public"/>
<!-- public以上进行检查 -->
</module>
<module name="JavadocStyle">
<!-- 检查javadoc的格式 -->
<property name="checkFirstSentence" value="false"/>
<!-- 不检查是否正常标点符号结尾 -->
<property name="checkEmptyJavadoc" value="true"/>
<!-- 检查空的javadoc -->
<property name="checkHtml" value="false"/>
<!-- 不检查html标签完整性 -->
</module>
<!-- 检查是否缺少@since标签 -->
<module name="WriteTag">
<property name="tag" value="@since"/>
<property name="tagFormat" value="^\d{4}-\d{2}-\d{2}$"/>
<property name="tagSeverity" value="ignore"/>
</module>
<module name="AnonInnerLength">
<!-- 检查内部类,最多60行 -->
<property name="max" value="60"/>
</module>
<module name="MethodLength">
<!-- 检查java方法,最大50 -->
<property name="countEmpty" value="false"/>
<property name="max" value="50"/>
</module>
<module name="ParameterNumber">
<!-- 检查参数个数,最大5 -->
<property name="max" value="5"/>
</module>
<!--Whitespace:空格检查-->
<!-- 方法或构造函数调用声明时,不能和左括号之间有空格 -->
<module name="MethodParamPad"/>
<!-- ~, \-\-(减减前缀), ++(加加前缀), .(点),!,-(负号),+(正号)这些符号背后不允许接空格。-->
<module name="NoWhitespaceAfter"/>
<!-- ;, .(点), \-\-(后缀), ++(后缀)这些符合前面不允许有空格 -->
<module name="NoWhitespaceBefore"/>
<!-- 一行写不下换行时操作符放行首 -->
<module name="OperatorWrap"/>
<!-- 左圆括号右侧不能有空格,右圆括号左侧不能有空格,如不允许set( a.getString() ) -->
<module name="ParenPad"/>
<!-- 类型转换原则检查,不允许有空格,如 String s = ( String )s1; -->
<module name="TypecastParenPad"/>
<!-- 不能一行有多个参数声明,如int x,y,不便于理解和注释 -->
<module name="MultipleVariableDeclarations"/>
<module name="GenericWhitespace"/>
<!-- 二元操作符前后需加空格。如比较操作符, 赋值操作符"="、 "+=",算术操作符"+"、"%",逻辑操作符"&&"、"&",位域操作符"<<"、"^"等 -->
<module name="WhitespaceAround">
<property name="tokens" value="COLON,NOT_EQUAL,QUESTION,DIV,DIV_ASSIGN,BXOR,BXOR_ASSIGN,MINUS,LCURLY,RCURLY,STAR,STAR_ASSIGN,TYPE_EXTENSION_AND,BAND,LAND,BAND_ASSIGN,MOD,MOD_ASSIGN,PLUS,PLUS_ASSIGN,LT,SL,SL_ASSIGN,LE,ASSIGN,MINUS_ASSIGN,EQUAL,GT,GE,SR,SR_ASSIGN,BSR,BSR_ASSIGN,BOR,BOR_ASSIGN,LOR,LITERAL_ASSERT,LITERAL_ASSERT,LITERAL_CATCH,LITERAL_DO,LITERAL_ELSE,LITERAL_FINALLY,LITERAL_FOR,LITERAL_IF,LITERAL_RETURN,SLIST,LITERAL_SYNCHRONIZED,LITERAL_TRY,LITERAL_WHILE"/>
</module>
<!-- 检查是否存在TODO(待处理) TODO是javaIDE自动生成的。一般代码写完后要去掉。 -->
<module name="TodoComment">
<property name="format" value="(TODO)|(FIXME)" />
</module>
<!--Modifiers:修饰符检查-->
<!-- 检查修饰符顺序,正确的是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"/>
<!--Block Checks:关于{}的检查-->
<module name="EmptyBlock"/>
<!-- 不允许有空块,如{} -->
<module name="LeftCurly">
<!-- 左侧大括号放在一行结束的右边 -->
</module>
<module name="NeedBraces"/>
<!-- if/eles while/do do/while for等要有{} -->
<module name="RightCurly">
<!-- 哪些情况右括号必须单独占行 -->
<property name="option" value="alone"/>
<property name="tokens" value="LITERAL_FINALLY, LITERAL_ELSE, CLASS_DEF, METHOD_DEF, CTOR_DEF, LITERAL_FOR, LITERAL_WHILE, STATIC_INIT, INSTANCE_INIT"/>
</module>
<module name="RegexpSinglelineJava">
<property name="format" value="printStackTrace"/>
<property name="message" value="编程规范-规则7.4 : 不允许打印堆栈信息"/>
<property name="ignoreComments" value="true"/>
</module>
<module name="RegexpSinglelineJava">
<property name="format" value="System.out.print.*"/>
<property name="message" value="编程规范-规则7.4 : 不允许使用控制台输出"/>
<property name="ignoreComments" value="true"/>
</module>
<module name="MagicNumber">
<!-- 魔鬼数字 -->
<property name="ignoreNumbers" value="0, 1, -1"/>
<!-- 对-1/0/1不检查 -->
<property name="ignoreHashCodeMethod" value="true"/>
<property name="ignoreAnnotation" value="true"/>
</module>
<!-- 检查不该抛出的异常,如未声明/Runtime -->
<module name="IllegalThrows">
<property name="illegalClassNames" value="java.lang.Error,java.lang.RuntimeException"/>
</module>
<module name="DeclarationOrder"/>
<!-- 检查类、接口内声明顺序: 类成员变量(public/protected/package(default friendly)/private)/实例变量(顺序同变量))/构造函数/共有方法/私有方法-->
<module name="UnnecessaryParentheses"/>
<!-- 不能使用不必要的圆括号 -->
<module name="StringLiteralEquality"/>
<!-- String不能用=或!=来判断相同 -->
<!--Class Design:类设计检查-->
<module name="VisibilityModifier">
<property name="packageAllowed" value="true"/>
<property name="protectedAllowed" value="true"/>
</module>
<!-- 检查类成员对外可见性,只有Static final的可以是public对外访问-->
<module name="HideUtilityClassConstructor"/>
<!-- Utility类(只有静态成员和方法的类)不能有公有构造函数 -->
<module name="ThrowsCount">
<!-- 同一个方法声明时最多可以抛出5个异常 -->
<property name="max" value="5"/>
</module>
<!-- 检查接口是否只定义了变量而没有定义方法,因为接口应该用来描述一个类型,所以只定义变量而不定义方法是不恰当的,from Effective Java-->
<module name="InterfaceIsType"/>
<!-- module name="CyclomaticComplexity"-->
<!-- 圈复杂度检查 ,不能超过10,公司当前最新的要求就是10-->
<!-- property name="max" value="10"/-->
<!-- /module-->
<!--Miscellaneous:杂项安全检查-->
<module name="UpperEll"/>
<!-- 定义使用long数据类型时用大写的L -->
<module name="Indentation">
<property name="basicOffset" value="4"/>
<property name="braceAdjustment" value="0"/>
<property name="caseIndent" value="4"/>
<property name="throwsIndent" value="4"/>
<property name="lineWrappingIndentation" value="8"/>
<property name="arrayInitIndent" value="4"/>
<property name="forceStrictCondition" value="false"/>
</module>
<!-- 检查代码缩进对齐 -->
<module name="UncommentedMain">
<!-- 通过该属性排除进程启动类 -->
<property name="excludedClasses" value="\.[a-zA-Z]*Application$"/>
</module>
<!-- 不能有没有用不到的main函数,建议测试代码用junit进行 -->
<module name="Regexp">
<property name="format" value="一句话功能简述"/>
<!-- 不能出现“一句话功能简述”不清楚的注释,用自动生成的注释忽悠人 -->
<property name="illegalPattern" value="true"/>
<property name="message" value="请添加简单功能描述"/>
</module>
<module name="Regexp">
<property name="format" value="功能详细描述"/>
<property name="illegalPattern" value="true"/>
<property name="message" value="请添加详细功能描述"/>
</module>
<!-- 第一章 命名检查开始-->
<!-- 规则1.2 import:import检查 -->
<!-- 不能import*的方式引入包 -->
<module name="AvoidStarImport"/>
<!-- 不能重复引入 -->
<module name="RedundantImport"/>
<!-- 不能有无用的import -->
<module name="UnusedImports"/>
<module name="ImportOrder">
<property name="groups" value="android,androidx,com.android,huawei,com,*,net,org,javacard,/^java\./,javax"/>
<property name="ordered" value="true"/>
<property name="separated" value="true"/>
<property name="option" value="top"/>
<property name="useContainerOrderingForStatic" value="true"/>
<property name="sortStaticImportsAlphabetically" value="true"/>
<!-- <property name="staticGroups" value="java,org"/> 需要升级到8.12-->
</module>
<!--
<module name="SuppressionXpathSingleFilter"><property name="checks" value="ImportOrder"/><property name="message" value="^'java\..*'.*"/></module>8.18-->
<!-- 检查空行分隔线:规则1.2 一个源文件按顺序包含版权、package、import、顶层类,且用空行分隔 -->
<module name="EmptyLineSeparator">
<property name="allowNoEmptyLineBetweenFields" value="true" />
<property name="allowMultipleEmptyLinesInsideClassMembers" value="false"/>
<property name="severity" value="warning"/>
</module>
<module name="ConstantName">
<!-- 常量命名检查 -->
<property name="format" value="(^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$)|(^log$)|(^logger$)"/>
</module>
<module name="LocalFinalVariableName">
<!-- 本地final变量命名检查 ipv6 ipv4 sha256-->
<property name="format" value="(^[a-z]([a-z0-9]+[A-Z]?)*$)"/>
</module>
<module name="LocalVariableName">
<!-- 本地变量名称检查 -->
<property name="format" value="(^m[a-zA-Z0-9]+$)|(^s[a-zA-Z0-9]+$)|(^[a-ln-rt-z]([a-z0-9]+[A-Z]?)*$)"/>
</module>
<module name="MemberName">
<!-- 成员名检查 ipv6 ipv4-->
<property name="format" value="(^m[a-zA-Z0-9]+$)|(^s[a-zA-Z0-9]+$)|(^[a-ln-rt-z]([a-z0-9]+[A-Z]?)*$)"/>
</module>
<module name="MethodName">
<!-- 方法名检查 -->
<property name="format" value="^[a-z]([a-z0-9]+[A-Z]?)*$"/>
</module>
<module name="PackageName">
<!-- 包名检查 -->
<property name="format" value="(^io.sermant(\.[a-z][a-z0-9]*)*$)|(^com.example(\.[a-z][a-z0-9]*)*$)"/>
</module>
<module name="ParameterName">
<!-- 参数检查: -->
<property name="format" value="(^[a-z]([a-z0-9]+[A-Z]?)*$)"/>
</module>
<module name="StaticVariableName">
<!-- 静态变量检查 -->
<property name="format" value="(^[a-rt-z]([a-z0-9]+[A-Z]?)*$)|(^s[a-zA-Z0-9]+$)|(^m[a-zA-Z0-9]+$)"/>
</module>
<module name="TypeName">
<!-- 类和接口检查 -->
<property name="format" value="^[A-Z]([a-z0-9]+[A-Z]?)*$"/>
</module>
<!-- 第一章 命名检查结束-->
<!-- 第二章 注释检查开始-->
<!--规则2.1 注释块标签顺序-->
<module name="AtclauseOrder">
<property name="tagOrder" value="@param, @return, @throws, @deprecated" />
<property name="target"
value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, METHOD_DEF, CTOR_DEF, VARIABLE_DEF" />
</module>
<!-- 第二章 注释检查结束-->
<!-- 第三章 排版检查开始-->
<!-- 采用java风格还是c风格,例如:int[] num是java风格,int num[]是c风格。规则3.7 禁止C风格的数组声明-->
<module name="ArrayTypeStyle"/>
<!-- 建议3.10 变量被声明在接近它们首次使用的行-->
<module name="VariableDeclarationUsageDistance">
<property name="allowedDistance" value="3"/>
<property name="severity" value="warning"/>
</module>
<!--建议3.9 应用于类,方法或构造方法的每个注解独占一行-->
<module name="AnnotationLocation">
<property name="allowSamelineMultipleAnnotations" value="false"/>
<property name="allowSamelineSingleParameterlessAnnotation" value="false"/>
<property name="allowSamelineParameterizedAnnotation" value="false"/>
</module>
<!-- 规则3.8 case语句块结束时如果不加break,需要有注释说明(fall-through) -->
<module name="FallThrough">
<property name="checkLastCaseGroup" value = "false"/>
<property name="reliefPattern" value="^.*[fallthru|falls|fall]?\s+through.*$"/>
</module>
<!-- 规则3.9 switch语句要有default分支,除非switch的条件变量是枚举类型 -->
<module name="MissingSwitchDefault"/>
<module name="DefaultComesLast"/>
<!-- 检查一行只有分号的情况 EmptyStatement -->
<module name="EmptyStatement"/>
<!-- 第三章 排版检查结束-->
<!-- 第四章 变量和类型检查开始-->
<!-- -->
<!-- 第四章 变量和类型检查结束-->
<!-- 第五章 方法检查开始-->
<!-- -->
<module name="AvoidNestedBlocks">
<!-- 不允许内嵌{} -->
<property name="allowInSwitchCase" value="true"/>
<!-- switch语句内允许 -->
</module>
<module name="NestedTryDepth">
<!-- 内嵌的CheckStyle最大深度为2 -->
<property name="max" value="2"/>
</module>
<module name="NestedIfDepth">
<!-- 内嵌的if最大深度为4 -->
<property name="max" value="2"/>
</module>
<module name="NestedForDepth">
<property name="max" value="2"/>
</module>
<!--规则5.4 不要把方法的入参当做工作变量/临时变量(例外是方法中确实需要修改入参内容) -->
<module name="ParameterAssignment"/>
<!-- 第五章 方法检查结束-->
<!-- 第六章 类和接口检查开始-->
<!-- 规则6.1 避免在无关的变量或无关的概念之间重用名字,避免隐藏(hide)、遮蔽(shadow)和遮掩(obscure)-->
<module name="HiddenField">
<!-- 检查局部变量和参数屏蔽了类的成员 -->
<property name="ignoreConstructorParameter" value="true"/>
<!-- 忽略对构造函数的检查 -->
<property name="ignoreSetter" value="true"/>
<!-- 忽略对set方法的检查 -->
<property name="ignoreAbstractMethods" value="true"/>
<!-- 忽略对抽象方法的检查 -->
<property name="setterCanReturnItsClass" value="true"/>
<!-- 允许set方法的返回值为类对象 -->
</module>
<!-- 规则6.3 覆写equals方法时,应同时覆写hashCode方法-->
<module name="EqualsHashCode"/>
<!-- 建议6.3 接口定义中去掉多余的修饰词-->
<module name="RedundantModifier"/>
<!-- 规则6.4 子类覆写父类方法时应加上@Override注解-->
<module name="MissingOverride"/>
<!-- 第六章 类和接口检查结束-->
<!-- 第七章 异常和日志检查开始-->
<!-- -->
<module name="IllegalCatch">
<property name="illegalClassNames"
value="java.lang.Exception,
java.lang.Throwable,
java.lang.RuntimeException,
java.lang.NullPointerException"/>
</module>
<!-- 第七章 异常和日志检查结束-->
<!-- 第八章 编程实践检查开始-->
<!--采用Java1.5提供新并发工具代替wait和notify -->
<module name="RegexpSinglelineJava">
<property name="format" value="\.yield\(\)"/>
<property name="message" value="编程规范-规则8.1.4 : 禁止使用yield方法"/>
</module>
<!--采用Java1.5提供新并发工具代替wait和notify -->
<module name="RegexpSinglelineJava">
<property name="format" value="\.wait\("/>
<property name="message" value="编程规范-规则8.1.5 : 禁止使用wait方法"/>
</module>
<module name="RegexpSinglelineJava">
<property name="format" value="\.setPriority\("/>
<property name="message" value="编程规范-规则8.1.4 : 禁止使用setPriority方法"/>
</module>
<module name="RegexpSinglelineJava">
<property name="format" value="\.notify\(\)"/>
<property name="message" value="编程规范-规则8.1.5 : 禁止使用notify方法"/>
</module>
<module name="RegexpSinglelineJava">
<property name="format" value="\.notifyAll\(\)"/>
<property name="message" value="编程规范-规则8.1.5: 禁止使用notifyAll方法"/>
</module>
<!-- the maximum allowed number of boolean operations in one expression -->
<module name="BooleanExpressionComplexity">
<property name="max" value="3"/>
</module>
<!-- 规则8.6.1 不要使用已标注为@deprecated的方法-->
<module name="SuppressWarnings"/>
<!--规则8.7.5 禁止使用主动GC(除非在密码、RMI等方面),尤其是在频繁/周期性的逻辑中 -->
<module name="RegexpSinglelineJava">
<property name="format" value="System\.gc\(\)"/>
<property name="message" value="编程规范-规则8.7.5: 禁止使用主动GC"/>
</module>
<!--规则8.7.6 禁止使用finalize()方法 -->
<module name="RegexpSinglelineJava">
<property name="format" value="finalize\(\)"/>
<property name="message" value="编程规范-规则8.7.6 : 禁止使用finalize方法"/>
</module>
<!--规则8.8.1 不要在代码中硬编码"\n"和"\r"作为换行符号 -->
<module name="RegexpSinglelineJava">
<property name="format" value="\\n|\\r"/>
<property name="message" value="编程规范-规则8.8.1: 请使用System.lineSeparator"/>
</module>
<!--规则8.9.2 不要依赖平台默认的字符编码方式,使用UTF-8 -->
<module name="RegexpSinglelineJava">
<property name="format" value="(\.getBytes\(\))|(\.bodyAsString\(\))|(new Scanner\(new File\([\w]+\)\))|(new Scanner\([\w]+\))"/>
<property name="message" value="编程规范-规则8.9.2: 不要依赖默认编码格式,请显示指定为UTF-8"/>
</module>
<!--规则8.9.3 字符串大小写转换、数字格式化为西方数字时,必须加上Locale.ROOT或Locale.ENGLISH -->
<module name="RegexpSinglelineJava">
<property name="format" value="\.(toLowerCase|toUpperCase)\((Locale\.[^ER][A-Z]+)?\)"/>
<property name="message" value="编程规范-规则8.9.3: 字符串大小写转换、数字格式化为西方数字时,必须加上Locale.ROOT或Locale.ENGLISH"/>
</module>
<module name="RegexpSinglelineJava">
<property name="format" value="String\.format\(((Locale\.[^ER][A-Z]+)|(".*")),\s.*\)"/>
<property name="message" value="编程规范-规则8.9.3: 字符串大小写转换、数字格式化为西方数字时,必须加上Locale.ROOT或Locale.ENGLISH"/>
</module>
<!-- 第八章 编程实践检查结束-->
<module name="OverloadMethodsDeclarationOrder"/>
<module name="InnerAssignment"/>
<module name="NoFinalizer"/>
<module name="ModifiedControlVariable"/>
<module name="SingleSpaceSeparator">
<property name="validateComments" value="true"/>
</module>
<!--字符串魔鬼常量-->
<module name="MultipleStringLiterals">
<property name="allowedDuplicates" value="2"/>
<property name="ignoreStringsRegexp" value='^(("")|(", "))$'/>
</module>
<module name="EqualsAvoidNull"/>
<module name="CommentsIndentation"/>
<module name="AbbreviationAsWordInName">
<property name="allowedAbbreviationLength" value="0"/>
</module>
</module>
</module>