一、 checkstyle介绍:
CheckStyle是SourceForge下的一个项目,提供了一个帮助JAVA开发人员遵守某些编码规范的工具。它能够自动化代码规范检查,从而规范化代码。
二、Checks
Checkstyle提供了许多可以应用于源代码的检查。下面是按字母顺序排列的参考,网站导航菜单提供按功能组织的参考。
AbbreviationAsWordInName | Check在标识符名称中验证缩写(连续大写字母)长度,它还允许强制执行camel case命名。 |
AbstractClassName | 确保抽象类的名称符合某些正则表达式并检查是否存在抽象修饰符。 |
AnnotationLocation | 检查语言元素上注释的位置。 |
AnnotationOnSameLine | 检查确实验证注释与其目标位于同一行。 |
AnnotationUseStyle | 此检查使用注释来控制样式。 |
AnonInnerLength | 检查长匿名内部类。 |
ArrayTrailingComma | 检查数组初始化是否包含可选的尾随逗号。 |
ArrayTypeStyle | 检查数组类型定义的样式。 |
AtclauseOrder | 检查at子句的顺序。 |
AvoidEscapedUnicodeCharacters | 限制使用Unicode转义。 |
AvoidInlineConditionals | 检测内联条件。 |
AvoidNestedBlocks | 查找嵌套块。 |
AvoidStarImport | 检查是否找到使用*表示法的import语句。 |
AvoidStaticImport | 检查是否找到静态导入。 |
BooleanExpressionComplexity | 将嵌套的布尔运算符(&&,||,&,|和^)限制为指定的深度(默认值= 3)。 |
CatchParameterName | 检查catch参数名称是否符合format属性指定的格式。 |
ClassDataAbstractionCoupling | 此度量标准衡量给定类中其他类的实例化数。 |
ClassFanOutComplexity | 给定类依赖的其他类的数量。 |
ClassTypeParameterName | 检查类类型参数名称是否符合format属性指定的格式。 |
CommentsIndentation | 控制注释和周围代码之间的缩进。 |
ConstantName | 检查常量名称是否符合format属性指定的格式。 |
CovariantEquals | 检查一个类是否定义了协变方法equals,然后定义方法equals(java.lang.Object)。 |
CustomImportOrder | 检查导入声明组是否按用户指定的顺序显示。 |
循环复杂度 | 根据指定的限制检查圈复杂度。 |
DeclarationOrder | 检查类或接口声明的各部分是否按照Java编程语言的代码约定建议的顺序出现。 |
DefaultComesLast | 检查默认值是否在switch语句中的所有case之后 。 |
DescendantToken | 检查其他令牌下面的受限令牌。 |
DesignForExtension | 检查类是否为继承而设计。 |
EmptyBlock | 检查空块但不验证顺序块。 |
EmptyCatchBlock | 检查空的catch块,几乎没有跳过违规的选项。 |
EmptyForInitializerPad | 检查空的填充初始化程序; 也就是说,对于初始化程序,空是否需要空格,或者禁止这样的空格。 |
EmptyForIteratorPad | 检查空的填充为迭代器; 也就是说迭代器的空是否需要空格,或者禁止这样的空格。 |
EmptyLineSeparator | 检查空行分隔符。 |
EmptyStatement | 检测空语句(独立';')。 |
EqualsAvoidNull | 检查字符串文字的任何组合是否在equals()比较的左侧。 |
EqualsHashCode | 检查覆盖equals()的类是否也覆盖hashCode()。 |
ExecutableStatementCount | 将可执行语句的数量限制为指定的限制(默认值= 30)。 |
ExplicitInitialization | 检查是否有任何类或对象成员显式初始化为其类型值的默认值(对象引用为null,数字类型为零,char为false ,false为布尔值。 |
下通 | 检查switch语句中的fall through查找case包含Java代码的位置 - 但缺少break,return,throw或continue语句。 |
文件长度 | 检查长源文件。 |
FileTabCharacter | 检查文件是否包含制表符。 |
FinalClass | 检查只有私有构造函数的类被声明为final。 |
FinalLocalVariable | 确保永远不会更改其值的局部变量必须声明为final。 |
FinalParameters | 检查方法/ constructor / catch / foreach参数是否为final。 |
GenericWhitespace | 检查Generic标记<和>周围的空白是否与典型约定相符。 |
头 | 根据固定的头文件检查源头。 |
HiddenField | 检查局部变量或参数是否不影响同一类中定义的字段。 |
HideUtilityClassConstructor | 确保实用程序类(仅包含静态方法的类)没有公共构造函数。 |
IllegalCatch | 捕获java.lang.Exception,java.lang.Error或java.lang.RuntimeException几乎是不可接受的。 |
IllegalImport | 检查从一组非法包中导入的内容。 |
IllegalInstantiation | 检查首选工厂方法的非法实例化。 |
IllegalThrows | 抛出java.lang.Error或java.lang.RuntimeException几乎是不可接受的。 |
IllegalToken | 检查非法令牌。 |
IllegalTokenText | 检查非法令牌文本。 |
IllegalType | 检查从未使用过特定的类或接口。 |
ImportControl | 检查控制每个包和文件中可以导入的内容。 |
ImportOrder | 确保导入组按特定顺序排列。 |
缩进 | 检查Java代码的正确缩进。 |
InnerAssignment | 检查子表达式中的赋值,例如 String s = Integer.toString(i = 2); 。 |
InnerTypeLast | 在所有方法和字段声明之后,检查嵌套(内部)类/接口是否在类的底部声明。 |
InterfaceIsType | 实现Bloch,Effective Java,第17项 - 仅使用接口来定义类型。 |
InterfaceMemberImpliedModifier | 检查接口成员和嵌套类型上的隐式修饰符。 |
InterfaceTypeParameterName | 检查接口类型参数名称是否符合format属性指定的格式。 |
JavadocMethod | 检查方法或构造函数的Javadoc。 |
JavadocPackage | 检查所有包都有包文档。 |
JavadocParagraph | 检查Javadoc段落。 |
JavadocStyle | 自定义Checkstyle检查以验证Javadoc。 |
JavadocTagContinuationIndentation | 检查at子句中延续行的缩进。 |
JavadocType | 检查类型的Javadoc。 |
JavadocVariable | 检查变量是否有Javadoc注释。 |
JavaNCSS | 此检查计算Java源文件和方法的非注释源语句(NCSS)度量标准。 |
LambdaParameterName | 检查以验证lambda参数名称。 |
LeftCurly | 检查左花括号在类型,方法和其他块上的位置: |
线路长度 | 检查排长队。 |
LocalFinalVariableName | 检查本地最终变量名称是否符合format属性指定的格式。 |
LocalVariableName | 检查本地非最终变量名称是否符合format属性指定的格式。 |
MagicNumber | 检查魔术数字。 |
成员名字 | 检查实例变量名称是否符合format属性指定的格式。 |
MethodCount | 通过访问修饰符或总计数检查每个类型声明中声明的方法数。 |
MethodLength | 检查长方法。 |
方法名 | 检查方法名称是否符合format属性指定的格式。 |
MethodParamPad | 检查方法定义,构造函数定义,方法调用或构造函数调用的标识符之间的填充; 和参数列表的左括号。 |
MethodTypeParameterName | 检查类类型参数名称是否符合format属性指定的格式。 |
MissingCtor | 检查类(抽象除外)定义ctor并且不依赖于默认类。 |
MissingDeprecated | 此类用于验证java.lang.Deprecated注释是否存在,并且存在任何一个@deprecated Javadoc标记。 |
MissingOverride | 当存在{@inheritDoc} javadoc标记时,此类用于验证java.lang.Override注释是否存在。 |
MissingSwitchDefault | 检查switch语句是否具有“default”子句。 |
ModifiedControlVariable | 检查是否确保for块中的循环控制变量未被修改。 |
ModifierOrder | 检查修饰符的顺序是否符合 Java语言规范第8.1.1,8.3.1和8.4.3节中的建议 。 |
MultipleStringLiterals | 检查单个文件中多次出现的相同字符串文字。 |
MultipleVariableDeclarations | 检查每个变量声明是否在它自己的语句中并且在它自己的行中。 |
MutableException | 确保异常(定义为符合某些正则表达式的任何类名)是不可变的。 |
NeedBraces | 检查代码块周围的大括号。 |
NestedForDepth | 将嵌套的块限制为指定的深度(默认值= 1)。 |
NestedIfDepth | 将嵌套的if-else块限制为指定的深度(默认值= 1)。 |
NestedTryDepth | 将嵌套的try-catch-finally块限制为指定的深度(默认值= 1)。 |
NewlineAtEndOfFile | 检查每个文件末尾是否有换行符。 |
NoClone | 检查是否未从Object类重写clone方法。 |
NoFinalizer | 检查是否使用名称finalize定义了没有参数为零的方法。 |
NoLineWrap | 检查所选语句是否不是换行的。 |
NonEmptyAtclauseDescription | 检查at子句标记后面是描述。 |
NoWhitespaceAfter | 检查令牌后面是否有空格。 |
NoWhitespaceBefore | 检查令牌之前是否有空格。 |
NPathComplexity | 根据指定的限制检查npath复杂度(默认值= 200)。 |
OneStatementPerLine | 检查每行只有一个语句。 |
OneTopLevelClass | 检查每个顶级类,接口或枚举是否驻留在自己的源文件中。 |
OperatorWrap | 检查运营商的换行。 |
OuterTypeFilename | 检查外部类型名称和文件名是否匹配。 |
OuterTypeNumber | 检查“外部”级别的已定义类型的数量。 |
OverloadMethodsDeclarationOrder | 检查重载方法是否组合在一起。 |
PackageAnnotation | 此检查确保所有包注释都在package-info.java文件中。 |
PackageDeclaration | 确保包装声明和(可选)在正确的目录中。 |
包裹名字 | 检查包名称是否符合format属性指定的格式。 |
ParameterAssignment | 禁止分配参数。 |
参数名称 | 检查参数名称是否符合format属性指定的格式。 |
ParameterNumber | 检查方法或构造函数具有的参数数量。 |
ParenPad | 检查括号的填充; 也就是说,在左括号之后和右括号之前是否需要空格,或者禁止这样的空格,除了它不检查右括号的填充是否为迭代器的空。 |
RedundantImport | 检查冗余的导入。 |
RedundantModifier | 检查接口和注释定义中的冗余修饰符,最终类方法的最终修饰符 ,声明为静态的内部接口声明,非公共类构造函数和枚举构造函数,声明为static的嵌套枚举定义。 |
正则表达式 | 检查以确保文件中存在(或不存在)指定的模式。 |
RegexpHeader | 根据包含a的头文件检查源头 |
RegexpMultiline | 执行看起来匹配任何文件类型的多行的检查。 |
RegexpOnFilename | 根据文件和/或文件夹路径实现匹配的检查。 |
RegexpSingleline | 执行检查以查找任何文件类型中的单行。 |
RegexpSinglelineJava | 执行检查以查找Java文件中的单行。 |
RequireThis | 检查代码是否依赖于“this”默认值。 |
ReturnCount | 将return语句限制为指定的计数(默认值= 2)。 |
RightCurly | 检查右花括号的位置。 |
SeparatorWrap | 检查使用分隔符的换行。 |
SimplifyBooleanExpression | 检查过于复杂的布尔表达式。 |
SimplifyBooleanReturn | 检查过于复杂的布尔返回语句。 |
SingleLineJavadoc | 检查JavaDoc块是否适合单行并且不包含at子句 |
SingleSpaceSeparator | 检查非空白字符是否由不超过一个空格分隔。 |
StaticVariableName | 检查静态非final变量名称是否符合format属性指定的格式。 |
StringLiteralEquality | 检查字符串文字是否与 ==或!=一起使用。 |
SummaryJavadoc | 检查Javadoc摘要语句是否包含不建议使用的短语。 |
SuperClone | 检查重写的clone()方法是否调用super.clone()。 |
SuperFinalize | 检查重写的finalize()方法是否调用super.finalize()。 |
SuppressWarnings | 此检查允许您指定哪些警告 |
ThrowsCount | 限制将语句抛出到指定的计数(默认值= 4)。 |
TodoComment | 检查TODO评论。 |
TrailingComment | 检查以确保要求评论是一行中的唯一内容。 |
翻译 | TranslationCheck类通过检查属性文件以确保其密钥的一致性,有助于确保代码的正确转换。 |
TypecastParenPad | 检查括号中的填充以进行类型转换。 |
类型名 | 检查类型名称是否符合format属性指定的格式。 |
UncommentedMain | 检测未注释的主要方法。 |
UniqueProperties | 检测属性文件中的重复键。 |
UnnecessaryParentheses | 检查语句或表达式中是否使用了不必要的括号。 |
UnusedImports | 检查未使用的import语句。 |
UpperEll | 检查长常量是否用上面的椭圆定义。 |
VariableDeclarationUsageDistance | 检查变量声明与其首次使用之间的距离。 |
VisibilityModifier | 检查班级成员的可见性。 |
WhitespaceAfter | 检查一个令牌后跟空格,除了它在迭代器的空分号后没有检查空格。 |
WhitespaceAround | 检查令牌是否被空格包围。 |
WriteTag | 输出JavaDoc标记作为信息。 |
三、 checkstyle应用
按照代码的生命周期,因而可以从以下两个方面进行代码规范化限制:
(一)、代码编写过程中
代码编写过程中,开发人员就可以按照一定规范进行编写,从而避免不规范代码产生。但为了更尺度化可以采用checkstyle的插件实现,即在开发工具
eclipse中安装checkstyle插件,在编写代码过程中将代码规范化:
eclipse安装checkstyle插件有以下两种方式,任选其一即可:
(1).安装
方法一:离线安装
1.下载checkstyle安装包
https://sourceforge.net/projects/eclipse-cs
2.下载完成后将压缩包中features文件夹和plugins文件夹的复制到eclipse中的根目录中进行合并;
3.打开eclipse,Window-->Preferences,如果列表中出现了checkstyle的菜单,则表示安装成功了
注意:如果启动eclipse时,提示ClassNotFoundException等异常信息,则启动时加上一个“-clean”参数启动即可。
方法二:在线安装
1.Help --> Install New Software
输入以下网址回车
http://eclipse-cs.sourceforge.net/update/
Next-->next-->选择 I accept... Finish。Checkstyle插件就开始安装
在安装过程中,可能会出现警告提示,选择ok即可。安装完成后,根据提示重启eclipse,checkstyle即安装完成。
2.Checkstyle项目配置:项目 --> 右键Properties
IDEA配置checkstyle插件
IDEA对checkstyle的支持比eclipse好。
注意:记得将IDEA的自动将import超过5来自于同一个包下就合并成 * 的改成多一点,不然你会烦的要死。
步骤一:下载checkstyle插件。在最上方的菜单栏中找到File中的settings,plugins即是下载插件的地方,我们再点击下方的Browse repositories,在其中查找checkstyle,并点击install就可以等待下载成功了
步骤二:接着在settings>>Other settings>>checkstyles的Configration file最右边有一个加号,点击它来添加配置文件,项目应该默认sun配置文件,如果想添加自己的规则则需要自己创建。
最后,在IDEA最底端工具栏就能使用checkstyle了。
到此项目配置已经完成。成功的话,checkstyle已经开始工作了,代码中会有很多红叉叉,说明是代码符合规范造成的,修改代码规范即可。
(二)代码提交到远程仓库过程中
提交过程中,由于项目版本管理使用的git,因此可以借用git的hook进行配合检查,具体原理可以查看相关资料,下面介绍自己项目中如何使用:
步骤:
2.将pre-commit文件复制到项目.git目录下hooks文件夹下即可
3.提交代码会检查不符合规则代码
以上就是代码规范检查checkstyle的介绍。
附件:
如果想自己定义代码检查规约,可以在本地磁盘的任何一个地方新建checkstyle.xml文件。
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>