快速使用Checkstyle(一)
1.介绍
Checkstyle是一种代码规约工具,可以帮助程序员编写符合编码标准的Java代码。使用
Checkstyle可以自定义一些代码规范用于在编译中强制执行。CheckStyle默认使用的是Sun的编码规范。本文以8.8版本进行编写。
参考资料:http://checkstyle.sourceforge.net/index.html
例如:
Sun:http://checkstyle.sourceforge.net/sun_style.html
Google:http://checkstyle.sourceforge.net/google_style.html,
对应文件下载地址(Github):
我们可以在提供的文件基础上做修改,也可以自己创建新的文件完全自定义。
注意事项:
CheckStyle7以后的版本需要JDK1.8编译要求。然而社区的成员已经创建了最新的Checkstyle版本的一个非官方的backport,以便可以在JDK1.6基础上运行,如果想在JDK1.8之前版本运行CheckStyle 7以后版本可以看看,具体的我就没去关注了。
Checkstyle配置模块需要在checker根模块下。大部分模块是TreeWalker子模块。TreeWalker通过将每个Java源文件分别转换为抽象语法树,然后将结果交给每个子模块进行操作检查。例如典型的配置如下:
<module name="Checker">
<module name="JavadocPackage"/>
<module name="TreeWalker">
<module name="AvoidStarImport"/>
<module name="ConstantName"/>
<module name="EmptyBlock"/>
</module>
</module>
2.Checks
按照check名称首字母往下排列。
AbbreviationAsWordInName
描述:检查目标元素名称中连续大写字母长度,允许强制执行骆驼命名。
父Module:TreeWalker
属性:如下表
名称 | 描述 | 类型 | 默认值 | 版本 |
allowedAbbreviationLength | 允许连续大写字母数量。 | Integer | 3 | 5.8 |
allowedAbbreviations | 自定义跳过检查缩写,多个已逗号分隔,不允许出现空格。 | Set<String> | {} | 5.8 |
ignoreFinal | 忽略使用final修饰的内容。 | Boolean | True | 5.8 |
ignoreStatic | 忽略使用static修饰的内容。 | Boolean | True | 5.8 |
ignoreOverriddenMethods | 忽略使用@Override修饰的方法。 | Boolean | True | 5.8 |
tokens | 指定tokens,具体的参照官网或者TokenTypes类。 | TokenTypes | 太多不写了。 | 5.8 |
例子:
<modulename="AbbreviationAsWordInName">
<property name="tokens"value="VARIABLE_DEF,CLASS_DEF"/>
<property name="ignoreStatic"value="false"/>
<propertyname="allowedAbbreviationLength" value="1"/>
<propertyname="allowedAbbreviations" value="XML,URL"/>
</module>
AbstractClassName
描述:验证抽象类名称。
父Module:TreeWalker
属性:如下表
名称 | 描述 | 类型 | 默认值 | 版本 |
format | 自定义格式 | Regular Expression | "^Abstract.+$" | 3.2 |
ignoreModifier | 是否忽略匹配名称的类的抽象(abstract)修饰符检查。 | Boolean | False | 5.3 |
ignoreName | 没啥用 | Boolean | False | 5.3 |
例子:
<modulename="AbstractClassName">
<property name="ignoreModifier"value="true"/>
</module>
AnnotationLocation
描述:检查注解位置。
父Module:TreeWalker
属性:如下表
名称 | 描述 | 类型 | 默认值 | 版本 |
allowSamelineMultipleAnnotations | 允许多个注解与目标元素在同一行。 | Boolean | False | 6.0 |
allowSamelineSingleParameterlessAnnotation | 允许单个参数或无参数的注解与目标元素位于同一行。 | Boolean | True | 6.1 |
allowSamelineParameterizedAnnotation | 允许只有一个参数的注解与目标元素未与同一行。 | Boolean | False | 6.4 |
tokens | 指定tokens,具体的参照官网或者TokenTypes类。 | TokenTypes | 太多不写 | 6.0 |
例子:
<modulename="AnnotationLocation">
<property name="allowSamelineMultipleAnnotations"value="true"/>
<propertyname="allowSamelineSingleParameterlessAnnotation"value="false"/>
<propertyname="allowSamelineParameterizedAnnotation"value="false"/>
</module>
AnnotationOnSameLine
描述:检查确认注解与目标位于同一行,不建议使用。
父Module:TreeWalker
属性:如下表
名称 | 描述 | 类型 | 默认值 | 版本 |
tokens | 指定tokens,具体的参照官网或者TokenTypes类。 | TokenTypes | 太多了不写 | 8.2 |
例子:
<modulename="AnnotationOnSameLine"/>
AnnotationUseStyle
描述:检查使用注解的样式。这个感觉没啥用所以就没细看了。
父Module:TreeWalker
AnonInnerLength
描述:检查匿名内部类长度限制。
父Module:TreeWalker
属性:如下表
名称 | 描述 | 类型 | 默认值 | 版本 |
max | 限制长度 | Integer | 20 | 3.2 |
例子:
<modulename="AnonInnerLength">
<property name="max"value="60"/>
</module>
ArrayTrailingComma
描述:检查数组初始化尾部是否有逗号。这个感觉没啥用所以就不说了。
父Module:TreeWalker
ArrayTypeStyle
描述:检查数组定义样式。
父Module:TreeWalker
属性:如下表
名称 | 描述 | 类型 | 默认值 | 版本 |
javaStyle | 强制使用Java风格,false为C风格。 | Boolean | true | 3.1 |
例子:
<modulename="ArrayTypeStyle"/>
AtclauseOrder
描述:检查javadoc块标签或javadoc标签的顺序。
父Module:TreeWalker
属性:如下表
名称 | 描述 | 类型 | 默认值 | 版本 |
violateExecutionOnNonTightHtml | 不是太明白,默认即可。 | Boolean | false | 8.3 |
target | 指定目标检查。 | TokenTypes | CLASS_DEF, INTERFACE_DEF, ENUM_DEF, METHOD_DEF, CTOR_DEF, VARIABLE_DEF | 6.0 |
tagOrder | 定义注释Tag顺序。用逗号分隔。 | Set<String> | @author, @version, @param, @return, @throws, @exception, @see, @since, @serial, @serialField, @serialData, @deprecated | 6.0 |
例子:
<modulename="AtclauseOrder">
<property name="tagOrder"value="@author, @version, @param,
@return, @throws, @exception, @see, @since,@serial,
@serialField, @serialData,@deprecated"/>
<property name="target"value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF,
METHOD_DEF, CTOR_DEF,VARIABLE_DEF"/>
</module>
AvoidEscapedUnicodeCharacters
描述:检查使用Unicode
父Module:TreeWalker
属性:如下表
名称 | 描述 | 类型 | 默认值 | 版本 |
allowEscapesForControlCharacters | 默认即可,google为true。 | Boolean | False | 5.8 |
allowByTailComment | 如果转义字符同行有注释则允许。 | Boolean | False | 5.8 |
allowIfAllCharactersEscaped | 如果字符串中所有的字符都被转义,则允许。 | Boolean | False | 5.8 |
allowNonPrintableEscapes | 默认即可,google为true。 | Boolean | False | 5.8 |
例子:
<modulename="AvoidEscapedUnicodeCharacters"/>
AvoidInlineConditionals
描述:检查内联条件,基本不用。内联条件例如:
String a = getParameter("a");
String b = (a==null || a.length<1) ? null :a.substring(1);
父Module:TreeWalker
AvoidNestedBlocks
描述:检查嵌套块。基本不用。
父Module:TreeWalker
AvoidStarImport
描述:检查是否使用*的导入语句。理由:从一个包中导入所有的类或从一个类中导入静态成员会导致包或类之间的紧密耦合,当一个新版本的库引入名称冲突时可能会导致问题。
父Module:TreeWalker
属性:如下表
名称 | 描述 | 类型 | 默认值 | 版本 |
excludes | 排除对某些包检查,子包不会自动排除。 | Set<String> | {} | 3.2 |
allowClassImports | 是否允许*进行导入包。 | Boolean | False | 5.3 |
allowStaticMemberImports | 是否允许*进行静态导入包。 | Boolean | False | 5.3 |
例子:
<modulename="AvoidStarImport">
<property name="excludes"value="java.io,java.net,java.lang.Math"/>
<propertyname="allowClassImports" value="false"/>
<propertyname="allowStaticMemberImports" value="false"/>
</module>
AvoidStaticImport
描述:检查是否有静态导入语句。基本不用。
父Module:TreeWalker
BooleanExpressionComplexity
描述:检查&&,||,&,|,^运算符在同一个表达式中使用次数。基本不用。
父Module:TreeWalker
CatchParameterName
描述:检查捕获参数(catch(Exception e))名称是否符合由format属性指定的格式。
父Module:TreeWalker
属性:如下表
名称 | 描述 | 类型 | 默认值 | 版本 |
format | 指定格式。 | Regular Expression | "^(e|t|ex|[a-z][a-z][a-zA-Z]+)$" | 6.14 |
例子:
<modulename="CatchParameterName">
<property name="format"value="^[a-z][a-zA-Z0-9]+$"/>
</module>
ClassDataAbstractionCoupling
描述:检查类中其他类实例化数量。基本不用。
父Module:TreeWalker
ClassFanOutComplexity
描述:检查一个给定的类所依赖的其他类的数量。基本不用。
父Module:TreeWalker
ClassTypeParameterName
描述:检查类类型参数的标识符命名规则。
父Module:TreeWalker
属性:如下表
名称 | 描述 | 类型 | 默认值 | 版本 |
format | 指定格式标识符。 | Regular Expression | "^[A-Z]$" | 5.0 |
例子:
<modulename="ClassTypeParameterName"/>
CommentsIndentation
描述:检查注释和代码之间的缩进。
父Module:TreeWalker
属性:无
ConstantName
描述:检查常量的标识符。
父Module:TreeWalker
属性:如下表
名称 | 描述 | 类型 | 默认值 | 版本 |
format | 指定格式标识符 | Regular Expression | "^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$" | 3.0 |
applyToPublic | 是否应用于public | Boolean | True | 5.0 |
applyToProtected | 是否应用于protected | Boolean | True | 5.0 |
applyToPackage | 是否应用于package | Boolean | True | 5.0 |
applyToPrivate | 是否应用于private | Boolean | True | 5.0 |
例子:
<modulename="ConstantName">
<property name="format"
value="^log(ger)?|[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$"/>
</module>
CovariantEquals
描述:检查是否equals的重载,如果有必须明确指定Object类型。基本上不用。
父Module:TreeWalker
CustomImportOrder
描述:检查导入声明按用户指定的顺序出现。如果有一个导入,没有在配置中指定,那么导入应该放置在导入列表的末尾。个人感觉没太大用,就不说了。
父Module:TreeWalker
属性:如下表
名称 | 描述 | 类型 | 默认值 | 版本 |
参照官网 | 参照官网 |
|
|
|
例子:
<modulename="CustomImportOrder">
<propertyname="customImportOrderRules"
value="STATIC###STANDARD_JAVA_PACKAGE###SPECIAL_IMPORTS"/>
<propertyname="specialImportsRegExp" value="^org\."/>
<property name="sortImportsInGroupAlphabetically"value="true"/>
<propertyname="separateLineBetweenGroups" value="true"/>
</module>
CyclomaticComplexity
描述:检查switch,while等复杂度,根据指定的检查。基本上不用。
父Module:TreeWalker
DeclarationOrder
描述:检查是否根据Java语言的代码约定,类或接口声明部分按照指定顺序出现。
1. 类(静态)变量。首先是public类变量,然后是protected,然后是package level(没有修饰符)最后是private。
2. 实例变量。首先是public类的变量,然后是protected,然后是package level(没有修饰符)最后是private。
3. 构造方法。
4. 方法。
父Module:TreeWalker
属性:如下表
名称 | 描述 | 类型 | 默认值 | 版本 |
ignoreConstructors | 是否忽略构造函数。 | Boolean | False | 5.2 |
ignoreModifiers | 是否忽略修饰符。 | Boolean | False | 5.2 |
例子:
<modulename="DeclarationOrder"/>
DefaultComesLast
描述:检查default是否在switch语句中的所有情况之后。
父Module:TreeWalker
属性:如下表
名称 | 描述 | 类型 | 默认值 | 版本 |
skipIfLastAndSharedWithCase | 是否允许default不是最后一个。 | Boolean | False | 7.7 |
例子:
<modulename="DefaultComesLast"/>
DescendantToken
描述:检查其他令牌下的受限制令牌。基本上不用。
父Module:TreeWalker
DesignForExtension
描述:检查类是否为继承而设计。基本上不用。
父Module:TreeWalker
EmptyBlock
描述:检查空的块。不验证顺序。可以通过tokens指定验证内容:如try,switch等。
父Module:TreeWalker
EmptyCatchBlock
描述:检查空的catch块。
父Module:TreeWalker
属性:如下表
名称 | 描述 | 类型 | 默认值 | 版本 |
exceptionVariableName | 指定异常变量名称,来跳过检查。 | String | "^$" | 6.4 |
commentFormat | 指定catch块第一行注释内容来跳过检查。 | String | ".*" | 6.4 |
例子:
<modulename="EmptyCatchBlock">
<propertyname="exceptionVariableName" value="expected|ignore"/>
</module>
EmptyForInitializerPad
描述:检查For初始化空白填充。基本上不用。
父Module:TreeWalker
EmptyForIteratorPad
描述:检查Iterator初始化空白填充。基本上不用。
父Module:TreeWalker
EmptyLineSeparator
描述:检查标题,包,所有导入声明,字段,构造函数,方法,嵌套类,静态初始化程序和实例初始化程序之后的空行分隔符。
父Module:TreeWalker
属性:如下表
名称 | 描述 | 类型 | 默认值 | 版本 |
allowNoEmptyLineBetweenFields | 字段之间不允许空行。 | Boolean | false | 5.8 |
allowMultipleEmptyLines | 允许类成员之间多个空行。 | Boolean | false | 6.3 |
allowMultipleEmptyLinesInsideClassMembers | 允许类成员中多个空行。 | Boolean | false | 6.18 |
tokens | 指定Tokens |
|
| 5.8 |
例子:
<modulename="EmptyLineSeparator"/>
EmptyStatement
描述:检查空语句,只有分号。
父Module:TreeWalker
属性:无
例子:
<modulename="EmptyStatement"/>
EqualsAvoidNull
描述:检查字符串使用equals比较是否在左侧。
父Module:TreeWalker
属性:
名称 | 描述 | 类型 | 默认值 | 版本 |
ignoreEqualsIgnoreCase | 是否忽略String.equalsIgnoreCase()调用。 | Boolean | false | 5.4 |
例子:
<modulename="EqualsAvoidNull"/>
EqualsHashCode
描述:检查如果重写equals()方法必须要求重写hashCode()方法。
父Module:TreeWalker
属性:无
例子:
<modulename="EqualsHashCode"/>
ExecutableStatementCount
描述:基本上不用。
父Module:TreeWalker
ExplicitInitialization
描述:基本上不用。
父Module:TreeWalker
FallThrough
描述:google_checkstyle.xml中有使用,我基本上不用。
父Module:TreeWalker
FileLength
描述:检查类文件行数长度。
父Module:Checker
属性:
名称 | 描述 | 类型 | 默认值 | 版本 |
max | 最大行数。 | Boolean | false | 3.2 |
fileExtensions | 指定处理文件后缀名。 | Set<String> | All Files | 5.0 |
例子:
<modulename="FileLength">
<property name="max"value="1500"/>
</module>
FileTabCharacter
描述:检查源代码中制表符('\ t')。
父Module:Checker
属性:
名称 | 描述 | 类型 | 默认值 | 版本 |
eachLine | 是否报告包含每一行,或只是第一个实例。 | Boolean | false | 5.0 |
fileExtensions | 指定处理文件后缀名。 | Set<String> | All Files | 5.0 |
例子:
<modulename="FileTabCharacter">
<property name="eachLine" value="true"/>
</module>