-
Notifications
You must be signed in to change notification settings - Fork 6
check set
CoderDream edited this page Apr 8, 2022
·
2 revisions
<?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">
<!--**************************************************************************************************************
文档说明:
1、根据CC公司V4.1设计
2、具体部门根据具体要求适当调整
@author:niudehua
**************************************************************************************************************-->
<module name="Checker">
<!--规则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 CC版权检查-->
<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="Check-Rule2.4: CC版权缺失或者格式不正确"/>
<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="Check-Rule2.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="Check-Suggest1.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="Check-Suggest1.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="Check-Suggest1.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="Check-Suggest1.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="Check-Suggest1.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="Check-Suggest1.1 含有集合意义的属性,名称尽量包含复数形式"/>
</module>
<module name="RegexpSingleline">
<property name="severity" value="warning"/>
<property name="format" value="\[\]\s.*(?<!Array|ARRAY|s|S)\s="/>
<property name="message" value="Check-Suggest1.1 含有集合意义的属性,名称尽量包含复数形式"/>
</module>
<module name="RegexpSingleline">
<property name="severity" value="warning"/>
<property name="format" value="\[\]\s\w+(?<!Array|ARRAY|s|S);$"/>
<property name="message" value="Check-Suggest1.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="Check-Suggest1.1 避免使用否定的布尔变量名"/>
</module>
<!-- 方法暂时不感知
<module name="RegexpSingleline"><property name="format" value="(boolean|Boolean)\s[^iIe][^sSq][^u]?[^a]?[^l]?[^s]?"/><property name="message" value="Check-Suggest1.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="Check-Suggest1.2 布尔变量名或方法以is开头(has have does do did will should can may must could等疑问助动词也可以,Android允许m作为疑问助动词前缀)"/>
</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="Check-Suggest1.2 布尔变量名以is后面字符必须是大写字母或者数字"/>
</module>
<!-- 规则2.5 注释符与注释内容间要有1空格;右置注释与前面代码至少1空-->
<module name="RegexpSingleline">
<property name="format" value="[^:]//[^\s]"/>
<property name="message" value="Check-Rule2.6: 请添加空格(单行注释符与注释内容间以空格分割)"/>
</module>
<!-- 检查类似:2):// 特殊场景,case xxx:后面加了注释 -->
<module name="RegexpSingleline">
<property name="format" value="case [\s\S]+[:]//"/>
<property name="message" value="Check-Rule2.6: 请添加空格(单行注释符与注释内容间以空格分割)"/>
</module>
<!-- 检查类似:/*XXXX*/ 右边无空格注释-->
<module name="RegexpSingleline">
<property name="format" value="(\*)+[\u4E00-\u9FA5A-Za-z0-9_]"/>
<property name="message" value="Check-Rule2.6: 请添加空格(单行注释符与注释内容间以空格分割)"/>
</module>
<module name="RegexpSingleline">
<property name="format" value="[\u4E00-\u9FA5A-Za-z0-9_]((\*)+)/"/>
<property name="message" value="Check-Rule2.6: 请添加空格(单行注释符与注释内容间以空格分割)"/>
</module>
<!--规则2.4 注释符与注释内容间要有1空格;右置注释与前面代码至少1空格-->
<module name="RegexpSingleline">
<property name="format" value=".*;//"/>
<property name="message" value="Check-Rule2.6:请添加空格(分号和单行注释符间以空格分割)"/>
</module>
<module name="RegexpSingleline">
<property name="format" value="^\s*//[^\u4e00-\u9fa5]*(\s*;|\{|\})$"/>
<property name="message" value="Check-Rule2.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="Check-Suggest4.2: 基本类型优于包装类型,注意合理使用包装类型"/>
</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="Check-Rule7.7: 禁止用中文打印日志"/>
</module>
<module name="RegexpSingleline">
<property name="format" value="^\s*return null;\s*$"/>
<property name="message" value="建议不要返回null! 1)Check-Suggest5.5: 集合请返回Collections.emptyXXX() 2)Check-Suggest8.6.2: 其他请使用JAVA 8 Optional特性代替"/>
</module>
<module name="RegexpSingleline">
<property name="severity" value="warning"/>
<property name="format" value="\s+$"/>
<property name="message" value="Check-Suggest3.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="Check-Suggest3.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="Check-Suggest8.7.2 : 初始化集合时,指定初始化大小"/>
</module>-->
<!-- 规则3.1 在条件语句和循环块中必须使用大括号 条件表达式用圆括号分组:方法调用不需要加圆括号
<module name="RegexpSingleline"><property name="format" value="(&{2}|\|{2})\s*[^(]*[\w\.]*\s*(<|>|>=|<=|==|!=)+"/><property name="message" value="Check-Suggest3.6 :超过1个的条件表达式应当用小圆括号分组"/></module><module name="RegexpSingleline"><property name="format" value="(<|>|>=|<=|==|!=)+\s*[\w\.]*[^)]\s*(&{2}|\|{2})"/><property name="message" value="Check-Suggest3.6 :超过1个的条件表达式应当用小圆括号分组"/></module><module name="RegexpSingleline"><property name="format" value="(<|>|>=|<=|==|!=)+\s*[\w\.]+[^)]\s*\?.*:"/><property name="message" value="Check-Suggest3.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="Check-Rule4.4 禁止尝试与NaN进行比较运算,相等操作使用Double或Float的isNaN方法"/>
</module>
<module name="RegexpSingleline">
<property name="format" value="^.*for\s+[(](float|double).*$"/>
<property name="message" value="Check-Rule4.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="Check-Rule8.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="Check-Rule3.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="Check-Suggest5.3 谨慎使用可变数量参数的方法。"/>
</module>
<module name="RegexpSingleline">
<property name="severity" value="warning"/>
<property name="format" value="\.ordinal\(\)"/>
<property name="message" value="Check-Suggest8.6.3 避免枚举常量序号的产生依赖于ordinal()方法。"/>
</module>
<!-- <module name="RegexpSingleline">
<property name="severity" value="warning"/>
<property name="format" value="native [a-z].*;$"/>
<property name="message" value="Check-Suggest8.8.1 谨慎地使用本地方法。"/>
</module>-->
<module name="RegexpSingleline">
<property name="format" value="\w{65,}"/>
<property name="message" value="Check-Rule1.2 名字长度不能超过64个字符。"/>
</module>
<module name="RegexpSingleline">
<property name="format" value="\s[a-z](\s|;)"/>
<property name="message" value="Check-Rule1.2 名字长度至少2个字符(循环变量、异常变量e当作误报忽略)。"/>
</module>
<module name="RegexpSingleline">
<property name="format" value=" [!=]= (false|true)"/>
<property name="message" value="Check-Rule8.3.1 冗余不简洁"/>
</module>
<module name="RegexpSingleline">
<property name="format" value="(false|true) [!=]= "/>
<property name="message" value="Check-Rule8.3.1 冗余不简洁"/>
</module>
<module name="RegexpSingleline">
<property name="format" value="(0|1) [!=]= "/>
<property name="message" value="Check-Suggest8.2.3 表达式的比较,应当遵循左侧倾向于变化、右侧倾向于不变的原则。"/>
</module>
<module name="RegexpSingleline">
<property name="format" value="^\s*\*\s*@apiNote\s*$"/>
<property name="message" value="Check-Rule2.3 推荐使用JDK1.8新的tag:@implSpec,@apiNote和@implNote,如果确实不需要请删除tag"/>
</module>
<module name="RegexpSingleline">
<property name="format" value="\.toArray\([\s\w]+\[[^0]\]"/>
<property name="message" value="Check-Rule8.7.1 将集合转为数组时使用toArray()方法且不带参数或者参数是类型相同零长度的数组"/>
</module>
<!-- 规则7.1 不要通过一个空的catch块忽略异常-->
<module name="RegexpMultiline">
<property name="format" value="catch\s+[(][^)]*[)]\s+[{]\s+[}]"/>
<property name="message" value="Check-Rule7.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="Check-Rule7.6 : 日志应分等级,对info及以下,使用条件形式或者使用占位符的方式"/>
</module>
<!-- 只能检查整个类被注掉的情况 -->
<module name="RegexpMultiline">
<property name="format" value="/[*]+\s+(private|public|protected|static)+[^(]*[(]+[^)]*[)]+\s+[{]+[^\*/]*[\*/]+"/>
<property name="message" value="Check-Rule2.7 : 不用的代码段直接删除,不要注释掉"/>
</module>
<module name="RegexpMultiline">
<property name="severity" value="warning"/>
<property name="format" value="(null == )|(null != )|([A-Z_]+ (<|>|>=|<=|==|!=)+)"/>
<property name="message" value="Check-Suggest8.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="Check-Suggest3.6 大括号内部首尾,不需要空行。"/>
</module>
<module name="RegexpMultiline">
<property name="severity" value="warning"/>
<property name="format" value="(^\s*[\r\n]){2,}"/>
<property name="message" value="Check-Suggest3.6 减少不必要的空行,保持代码紧凑(最多一个空行)。"/>
</module>
<module name="RegexpMultiline">
<property name="format" value="Ltd. ([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>
<!-- Check-Rule2.2 -->
<module name="RegexpMultiline">
<property name="format" value="\*/[\r\n]{3,}(public|private|protected)\s+(class|interface|enum)\s"/>
<property name="message" value="Check-Rule2.2:顶层类(接口或者枚举)头与类(接口或者枚举)首行不应该有空行"/>
</module>
<module name="RegexpMultiline">
<property name="format" value="\*/[\r\n]{3,}(class|interface|enum)\s"/>
<property name="message" value="Check-Rule2.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="Check-Rule2.6:注释正文与其下的各个Javadoc tag之间加1个空行"/>
</module>
<module name="RegexpMultiline">
<property name="format" value="(;|\})(\n|\r\n) +// "/>
<property name="message" value="Check-Rule2.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="Check-Rule2.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="Check-Suggest8.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="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="Check-Rule7.4 : 不允许打印堆栈信息"/>
<property name="ignoreComments" value="true"/>
</module>
<module name="RegexpSinglelineJava">
<property name="format" value="System.out.print.*"/>
<property name="message" value="Check-Rule7.4 : 不允许使用控制台输出"/>
<property name="ignoreComments" value="true"/>
</module>
<module name="MagicNumber">
<!-- 魔鬼数字 -->
<property name="ignoreNumbers" value="0, 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"/>
<!-- 检查代码缩进对齐 -->
<module name="UncommentedMain">
<!-- 通过该属性排除进程启动类 -->
<property name="excludedClasses" value="\.[a-zA-Z]*Main$"/>
</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.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="^com.huawei(\.[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"/>
<!-- 第二章 注释检查结束-->
<!-- 第三章 排版检查开始-->
<!-- 采用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="Check-Rule8.1.4 : 禁止使用yield方法"/>
</module>
<!--采用Java1.5提供新并发工具代替wait和notify -->
<module name="RegexpSinglelineJava">
<property name="format" value="\.wait\("/>
<property name="message" value="Check-Rule8.1.5 : 禁止使用wait方法"/>
</module>
<module name="RegexpSinglelineJava">
<property name="format" value="\.setPriority\("/>
<property name="message" value="Check-Rule8.1.4 : 禁止使用setPriority方法"/>
</module>
<module name="RegexpSinglelineJava">
<property name="format" value="\.notify\(\)"/>
<property name="message" value="Check-Rule8.1.5 : 禁止使用notify方法"/>
</module>
<module name="RegexpSinglelineJava">
<property name="format" value="\.notifyAll\(\)"/>
<property name="message" value="Check-Rule8.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="Check-Rule8.7.5: 禁止使用主动GC"/>
</module>
<!--规则8.7.6 禁止使用finalize()方法 -->
<module name="RegexpSinglelineJava">
<property name="format" value="finalize\(\)"/>
<property name="message" value="Check-Rule8.7.6 : 禁止使用finalize方法"/>
</module>
<!--规则8.8.1 不要在代码中硬编码"\n"和"\r"作为换行符号 -->
<module name="RegexpSinglelineJava">
<property name="format" value="\\n|\\r"/>
<property name="message" value="Check-Rule8.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="Check-Rule8.9.2: 不要依赖默认编码格式,请显示指定为UTF-8"/>
</module>
<!--规则8.9.2 不要依赖平台默认的字符编码方式,使用UTF-8 -->
<module name="RegexpSinglelineJava">
<property name="format" value="(\.getBytes\(\))|(\.bodyAsString\(\))|(new InputStreamReader\(new [\w\.]+\([\w]+\)\))|(new InputStreamReader\([\w]+\))"/>
<property name="message" value="Check-Rule8.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="Check-Rule8.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="Check-Rule8.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>