快速使用Checkstyle(一)

快速使用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):

https://github.com/checkstyle/checkstyle/tree/60f41e3c16e6c94b0bf8c2e5e4b4accf4ad394ab/src/main/resources

         我们可以在提供的文件基础上做修改,也可以自己创建新的文件完全自定义。

注意事项:

         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>

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值