Checkstyle是一款为Java代码实施编码约定和最佳时间规则的开源工具,尽管它最初被设计用于实施编码标准,但现在它也允许用户检查最佳编码实践。它分析Java源代码并报告违反标准的情况,可以通过插件将其继承到自己喜欢的继承开发环境中,以便开发人员能够立即看到并纠正违反正式标准的情况。
Checkstyle提供了现成的标准Sun约定,包括120个规则和标准,这些约定能够处理各种问题:从代码格式、命名约定,企业JavaBean(EJB)最佳时间,到代码复杂性度量。Checkstyle支持与以下方面有关的标准:
Javadoc注释
命名约定
文件头
导入语句
空白
修饰符
代码块
编码问题
类设计
J2EE
Eclipse安装和使用Checkstyle操作步骤
在Eclipse中Checkstyle插件的安装
选择Help->Eclipse Market->Search。搜索Checkstyle插件,并安装
为特定项目激活Checkstyle检查
一旦安装好插件,需要为特定项目激活Checkstyle检查,默认情况下不会为项目激活Checkstyle。选择项目,右键->Propterties->Checkstyle。确保选中Checkstyle active for this project复选框(位置1)。
还可以指定要用于此项目的规则集(位置2),Eclipse的Checkstyle插件提供了两个规则集:Sun Java编码标准以及对Sun规则略做修改的版本。后者更适合标准Eclipse格式约定。
Checkstyle代码检查可能很耗时,尤其是在检查大量文件时。过多的错误还可能使用户更难将精力集中在真正需要纠正的问题上。Exclude from checking…(位置3)选项可以过滤掉不需要进行检查的特定类或软件包。
查看检查结果,并更正错误
Checkstyle检查完成之后,可以在Problems视图窗格中看见一长串违反规则的警告情况。
单击列表中的问题,将自动跳转到违反规则的代码段。违反规则的代码以黄色突出显示,另外在边上还有相应的标记。
在Eclipse中定制Checkstyle规则
实施通过配置文件提供的现成的Sun编码标准有时可能让人不知所措,Checkstyle可能会指出数以百计的相对小的规则违反情况,尤其是在没有使用Checkstyle时已经编写了大量代码的情况下。
要以最佳实践方式采用编码标准,并用Checkstyle来实施编码标准,通常需要彩种灵活的方式。这样做的最简单的方式是创建一组自定义编码标准,这些标准专门为公司或单位项目设计。
Eclipse的Windows->Preference->Checkstyle首选项。将会看见一些内置的配置文件。
需要创建新的Checkstyle配置文件,只需要单击New按钮,有多种配置文件可供使用,包括:
内置配置(Built-in confiturations):例如Sun标准编码,它们由Checkstyle插件提供,并且不能更改。
内部配置(Internal configurations):存储在Eclipse元数据中。这些配置对于在本地实验新的配置很有用,但不方便与其他团队成员共享它们。
外部配置(External configurations):从外部来源导入。可以从本地磁盘的外部文件中或web服务器导入外部配置,或者存储在Eclipse项目中的配置管理下。
项目相对配置(Project Relative configurations):当其他工具如Ant或Maven也要在构建过程中使用相应的Checkstyle配置文件时,此配置尤其有用。
新建规则后,双击新的规则。在对话框中选取相应的规则,并根据自己的需求进行更改。
3.规则详情
a) Annotations
b) JavadocCommnents
Method Javadoc:检查方法或者构造器的doc注释。
Type Javadoc:检查类和接口的doc注释。
VariableJavadoc:检查变量的doc注释。
c) NamingConventions
Abstract Class Name:根据命名约定检查抽象类名称。
Constant Names:根据命名约定检查(static final)常量参数的名称。
Local Final Variable Names:根据命名约定检查局部最终变量的名称。
Local Variable Names:根据命名约定检查局部变量的名称。
Member Names:根据命名约定检查(no-static)成员变量的名称。
Methods Names:根据命名约定检查方法的名称。
Method Type Parameter Name:根据命名约定检查形式参数的名称。
Package Names:根据命名约定检查包的名称。
Parameter Names:根据命名约定检查参数的名称。
Static Variable Names:根据命名约定检查(static no-final)静态变量名称。
Type Name:根据命名约定检查类的名称。
d) Headers
e) Imports
AvoidStar(Demand)Imports:确保没有使用*符号import语句。
Avoid StaticImports:确保没有静态import语句。
Import OrferCheck:检查import语句的顺序/分组。
RedundantImports:确保没有多余的import语句。
Unused Imports:确保没有无用的imoport语句。
f) SizeViolations
Anonymous inner classes length:检查内部类的长度。
Executable Statement Size:为可执行语句(实例初始化、静态初始化、方法声明,构造器声明)指定一个确切的行数约束。
Maxinum File Length:最大的文件长度。
Maxinum Line Length:最大的行长度。
Maxinum Method Length :最大的方法长度。
Maxinum Parameters:最大的参数个数。
Outer Type Number:返回值个数。
Method Count在每个类、接口中声明的方法的个数。
g) Whitespace
h) Regexp
i) Modifiers
Modifier Order:遵照Java语言规范的建议检查访问修饰符的顺序。
RedundantModifier:检查多余的访问修饰符。
j) Blocks
Avoid NestedBlocks:避免嵌套代码块。
Empty Block:检查空的代码块。
Left Curly BracePlacement:左花括号的位置。
Need Braces:检查需要的大括号。
Right CurlyBrace Placemnent:右花括号的位置。
k) CodingProblems
Avoid InlineConditionals:避免行内的条件句。
Default ComesLast:检查default在一个switch语句的所有case的后面。
DeclarationOrder Check:根据Java语言编码规范,检查类或者接口内的顺序。
Empty Statement:检测空语句。
Equals AvoidNull:避免字符串equals方法的Null情况。
Equals andHashCode:检查覆盖equals()的类也覆盖了hashCode()。
ExplicitInitialization:检查类或者对象的成员被明确的初始化为它的类型的默认值。
Fall Through:检查在switch语句中的落空,就是一个case语句,但是没有break,return,throw或者continue语句的位置。
Magic Number:确保没有“魔法数字”,如-1,0,1和2等。
MissingConstructor:确保类定义了一个构造器,并没有以来默认的构造器。
Missing SwitchDefault:确保switch语句有default语句。
Mofified ControlVariable:确保循环变量在循环体中没有被修改。
Mutiple StringLiterals:确保在一个文件中没有多个相同的字符串常量。
Nested ForDepth:for语句嵌套深度。
Nested IfDepth:if语句的嵌套深度。
Nested TryDepth:try语句的嵌套深度。
No Finalizer:检查在一个类中没有finalize()方法被定义。
PackageDeclaration:确保一个类有一个包的声明,并且(可选的)包名匹配源文件的名称。
Require This:检查没有依赖this的代码。引用当前对象的实例变量和方法,显示的调用”this.varName”或者”this.methodName(args)”。
Return Count:约束返回语句的个数。
Simplify BooleanExpression:检查复杂的布尔表达式。
Simplify BooleanReturn:检查难懂的布尔返回语句。
String LiteralEquality:检查字符串没有使用==或者!=。
SuperClone:检查覆盖finalize()方法调用super.finalize()。
SuperFinalize:检查覆盖clone()方法调用super.clone()。
Trailing ArrayComma:检查数组初始化拖拽的逗号。
UnnessaryParentheses:不需要的圆括号。
One StatementPer Line:检查每行一个语句。
l) ClassDesign
m) Duplicates
n) Metrics
BooleanExpression Complexity:约束&&,||,&,|和^在一个表达式中的个数。
o) Miscellaneous
p) Other
q) Filters