1、CheckStyle 说明文档目录CheckStyle 安装使用 11 安装 12 使用 12.1 勾选了“Use simple configuration”22.2 没有勾选“Use simple configuration”22.3 Exclude from checking 22.4 Local Check Configuration.33 代码规范配置文件 43.1 配置代码规范 .43.1.1 新建规范文件 43.1.2 代码规范配置选项 .53.2 Module 配置 .63.2.1 Annotations63.2.2 BlockChecks .83.2.3 Class Desig
2、n103.2.4 Coding 123.2.5 Duplicate Code.243.2.6 Headers 243.2.7 Imports.253.2.8 Javadoc Comments 293.2.9 Metrics .323.2.10 Miscellaneous 343.2.11 Modifiers393.2.12 Naming Conventions393.2.13 Regexp413.2.14 Size Violations 423.2.15 Whitespace 453.3 常见 CheckStyle 错误提示 493.4 CheckStyle 配置范例 511CheckStyl
3、e 安装使用1 安装将 features 和 plugins 分别 copy 到 eclipse/plugins 和/eclipse/features 目录,重启 Eclipse 即完成 checkstyle插件安装, 依次点击 window Preferences,如果出现 Checkstyle 标签,说明安装成功:安装完成 CheckStyle 插件后,下面就是统一 Eclipse 的格式化模板,要让格式化出来的代码符合 Checkstyle要求,将 topsec_format.xml 文件导入到 eclipse,方法如下:Window PreferencesJavaCode StyleF
4、ormatter点击 import 按钮即完成导入,如图:建议:用 ctrl+shift+f 格式化代码。2 使用右键点击要进行代码规范检查的项目,选择 CheckstyleCheck Code With CheckStyle, 即完成代码检查:33 代码规范配置文件在 eclipse 的 windows-Preferences 找到 CheckStyle 进行配置。可以建立新的全局代码规范文件,并设为默认规范。3.1 配置代码规范3.1.1 新建规范文件点击“New”新建一个代码规范配置文件,如图 3-1 所示。图 3-1 新建代码规范文件示意图在弹出对话框中,首先选择文件类型,包括 Int
5、ernal Configuration ,External Configuration File ,Remote Configuration ,Project Relative Configuration 四种类型。Internal Configuration:内建于 eclipse 的 workspace 中,位于 workspace_dir/.metadata/.plugins/ net.sf.eclipsecs.core 目录下,无法在项目目录中看到,文件内容可从已有的规范文件中导入,点击右下的“Import”按钮,找到相应的规范文件即可,此时是将外部分配置文件复制到workspace_
6、dir/.metadata/.plugins/ net.sf.eclipsecs.core 目录下,重新命名。External Configuration File:直接在项目中引用外部代码规范文件,并可以通过对规范进行配置来修改外部文件。适合团队协作开发。勾选“Protect CheckStyle Configuration File”防止源文件被改写。Remote Configuration:连接到远程代码规范文件,需要提供地址,用户名和密码。勾选“Cache Configuration File”来对远程文件进行缓存处理。此文件的配置不可修改,否则经过配置后会修改原规范文件,删除掉原规范
7、文件的所有注释。Project Relative Configuration:当代码规范配置文件已经存在于 workspace 中的项目里时,适合于使用此选项。此处可以再确定配置类型后,直接从已有的规范文件中导入,点击“Import”按钮,找到相应的文件即可。此处可以点击“Additional Properties”按钮自定义一些变量,方便在后面配置自定义消息时使用。内建的变量如下:$basedir : 当前工程所在的目录$project_loc : 与$basedir相同$workspace_loc : 当前 workspace 的目录$config_loc 当左右大括号在同一行时,可以不尾
8、随逗号。例如,return new int 0 ;1、 parent moduleTreeWalker2、 xml 代码3.2.4.2 AvoidInlineConditionals检查 inline 的条件操作。如,String b = (a=null | a.length3.2.4.3 CovariantEquals检查是否类既定义了 equals()方法,又继承了 equals(java.lang.Object)方法。张洋这样可能会产生无法预测的运行时异常。1、 parent moduleTreeWalker2、 xml 代码3.2.4.4 DoubleCheckedLocking对双检
9、锁进行测定。含有双检锁的 java 代码可能无法正确的工作,所产生的 bug 难以跟踪,不易重复产生。双检锁举例:public class MySingletonprivate static theInstance = null;private MySingleton() public MySingleton getInstance() if ( theInstance = null ) / synchronize only if necessarysynchronized( MySingleton.class ) if ( theInstance = null ) theInstance =
10、 new MySingleton();1、 parent moduleTreeWalker2、 xml 代码3.2.4.5 EmptyStatement对空语句(只有“;“)进行检查。1、 parent moduleTreeWalker2、 xml 代码133.2.4.6 EqualsAvoidNull对字符串比较进行检查,确保字符串值在左侧,例如,String str1 = “this is a example” ;“another example”.equals(str1) ;1、 parent moduleTreeWalker2、 xml 代码3.2.4.7 EqualsHashCode
11、检查重写了 equals()方法的类是否也重写了 hashcode()方法。1、 parent moduleTreeWalker2、 xml 代码3.2.4.8 FinalLocalVariable检查始终没有改变过值的局部变量是否定义为 final。也可检查没改变过值的参数是否定义为 final。注意:当设置检查参数后,会忽略对接口方法和抽象方法参数的检查。1、 Propertiestokens :对哪种变量进行检查检查。默认值为 VARIABLE_DEF,即对类成员进行检查。2、 parent moduleTreeWalker3、 xml 代码3.2.4.9 检查局部变量或参数是否隐藏了类
12、中的变量。1、 PropertiesTokens : 检查哪类参数。默认值为 PARAMETER_DEF, VARIABLE_DEFignoreFormat : 忽略匹配正则表达式的名字。默认不启用该匹配。ignoreConstructorParameter : 是否忽略构造函数中的参数,默认为 false。ignoreSetter : 是否忽略对 setter 方法的参数检查,默认为 false。ignoreAbstractMethods : 是否忽略对抽象方法的参数检查,默认为 false。2、 parent moduleTreeWalker3、 xml 代码3.2.4.10 Illega
13、lInstantiation当一个类有工厂方法实例化时,检查是否使用工厂方法实例化。例如,Boolean 对象构造使用的是Boolean.valueOf(),而非构造函数。1、 Propertiesclasses : 哪些类不需要实例化,应使用工厂方法。默认为空。2、 parent moduleTreeWalker3、 xml 代码3.2.4.11 IllegalToken检查非法的标记。1、 Propertiestokens : 需要检查的分隔符。默认为,LITERAL_SWITCH, POST_INC, POST_DEC2、 parent moduleTreeWalker3、 xml 代码
14、3.2.4.12 IllegalTokenText检查非法的标记文本内容。1、 Propertiestokens:哪些标记要检查。默认为空。format:匹配该正则表达式的为非法文本内容。默认为空。ignoreCase:匹配时,是否大小写敏感。默认为 falsemessage:出现非法内容时的提示信息。默认为空。2、 parent module15TreeWalker3、 xml 代码3.2.4.13 InnerAssignment检查字表达式是否有复制语句,例如, ”String s = Integer.toString(i = 2);”,for 语句除外。1、 Propertiestoke
15、ns:哪些标记需要检查。默认全部检查。ASSIGN, BAND_ASSIGN, BOR_ASSIGN, BSR_ASSIGN, BXOR_ASSIGN, DIV_ASSIGN, MINUS_ASSIGN, MOD_ASSIGN, PLUS_ASSIGN, SL_ASSIGN, SR_ASSIGN, STAR_ASSIGN2、 parent moduleTreeWalker3、 xml 代码3.2.4.14 MagicNumber对魔法数进行检查,不应出现魔法数。 ,注,-1,0,1,2 不认为是魔法数。1、 Propertiestokens:哪些类型需要检查。默认全部检查。ignoreNumb
16、ers:哪些不认为是魔法数,默认为-1,0,1,22、 parent moduleTreeWalker3、 xml 代码3.2.4.15 MissingSwitchDefault检查 switch 语句块中是否有 default 子句。1、 parent moduleTreeWalker2、 xml 代码3.2.4.16 ModifiedControlVariable检查在循环语句是否修改了控制变量。1、 parent moduleTreeWalker2、 xml 代码3.2.4.17 RedundantThrows检查是否有重复被抛出的异常,包括,重复、未被查出的或另一个已声明的异常的子类。
17、1、 PropertiesallowUnchecked:是否允许有未被查出的异常存在于。默认为 false。allowSubclasses:是否允许存在另一个异常的子类。默认为 false。logLoadErrors:这个检查会载入throws 标签提到的 exception 类,来检查它是否是运行时异常。若载入错误,该属性的设置会指定 checkstyle 的错误处理。若设置为 false,则认为是类路径配置错误,TreeWalker 完全停止对该类的操作。若设置为 true,则 checkstyle 认为是 javadoc 的错别字或重构时产生的错误,并在 checkstyle 的普通报表
18、中记录该问题。默认值为 false。suppressLoadErrors:当 logLoadErrors 设置为 true 时,TreeWalker 会完全处理该类,并显示 在载入异常时出现的问题。若 suppressLoadErrors 设置为 true,因 logLoadErrors 设置为 true 而产生的对规范的违背就不会被 checkstyle 记录。默认为 false。2、 parent moduleTreeWalker3、 xml 代码3.2.4.18 SimplifyBooleanExpression对过于复杂的 boolean 表达式进行检查。1、 parent modul
19、eTreeWalker2、 xml 代码3.2.4.19 SimplifyBooleanReturn对复杂的 boolean 返回值表达式进行检查。171、 parent moduleTreeWalker2、 xml 代码3.2.4.20 StringLiteralEquality检查字符串比较是否使用“=”或“!=” 。1、 parent moduleTreeWalker2、 xml 代码3.2.4.21 NestedIfDepth对 if 语句的嵌套进行检查。1、 max:if 语句的最大嵌套层数。默认为 1。2、 parent moduleTreeWalker3、 xml 代码3.2.4
20、.22 NestedTryDepth对 if 语句的嵌套进行检查。1、 max:try 语句的最大嵌套层数。默认为 1。2、 parent moduleTreeWalker3、 xml 代码3.2.4.23 NoClone检查类是否对 clone()方法进行了重写。建议不要重写。1、 parent moduleTreeWalker2、 xml 代码3.2.4.24 NoFinalizer检查类中是否定义了 finalize()方法。1、 parent moduleTreeWalker2、 xml 代码3.2.4.25 SuperClone检查在覆盖 clone()的方法里是否调用了 super
21、.clone()。1、 parent moduleTreeWalker2、 xml 代码3.2.4.26 SuperFinalize检查在覆盖 finalize()的方法里是否调用了 super.finalize()。1、 parent moduleTreeWalker2、 xml 代码3.2.4.27 IllegalCatch检查是否非法捕获了 java.lang.Exception, java.lang.Error 或 java.lang.RuntimeException。1、 PropertiesillegalClassNames:不要捕获的 exception 的名字。默认值为 ”ja
22、va.lang.Exception, java.lang.Throwable, java.lang.RuntimeException”。2、 parent moduleTreeWalker3、 xml 代码3.2.4.28 IllegalThrows检查是否抛出了非法的异常,如,java.lang.Error 或 java.lang.RuntimeException。191、 PropertiesillegalClassNames:哪些异常不应抛出,默认值为“java.lang.Throwable, java.lang.Error, java.lang.RuntimeException“2、
23、parent moduleTreeWalker3、 xml 代码3.2.4.29 PackageDeclaration检查是否每个类都有包声明。1、 parent moduleTreeWalker2、 xml 代码3.2.4.30 JUnitTestCase该检查确保 setUp(),tearDown()方法的正确命名,没有参数,返回 void,并且可见性只能是 public 或protected。同时确保 suite()方法的正确命名,无参数,返回 junit.framewotk.Test,并且可见性只能是 public 或protected。1、 parent moduleTreeWalk
24、er2、 xml 代码3.2.4.31 ReturnCount检查 return 语句的数目。1、 Propertiesmax:允许 return 语句出现的最大数目,默认为 2。format:哪些方法不检查。默认为”equals$”,即 equals()方法不检查。2、 parent moduleTreeWalker3、 xml 代码3.2.4.32 IllegalType检查是佛有未使用过的类型。包括设声明、返回值和参数。1、 Propertiestokens:要检查哪些关键字。默认全部检查。PARAMETER_DEF, VARIABLE_DEF METHOD_DEF。illegalCla
25、ssNames:不能用在参数,类型声明和返回值的类型,默认为“java.util.GregorianCalendar, java.util.Hashtable, java.util.HashSet, java.util.HashMap, java.util.ArrayList, java.util.LinkedList, java.util.LinkedHashMap, java.util.LinkedHashSet, java.util.TreeSet, java.util.TreeMap, java.util.Vector“legalAbstractClassNames:可以作为类型声明的
26、抽象类。无默认值。ignoredMethodNames:哪些方法不要检查。默认值为“getInitialContext, getEnvironment“。format:非法类型的正则表达式。默认值为(.*.)?Abstract.*$2、 parent moduleTreeWalker3、 xml 代码3.2.4.33 DeclarationOrder对类或接口的声明顺序进行检查。顺序如下:(1)静态变量,publicprotectedpackageprivate(2)实例变量,publicprotectedpackageprivate(3)构造方法(4)成员方法。1、 parent modul
27、eTreeWalker2、 xml 代码3.2.4.34 ParameterAssignment不允许对参数赋值的检查。1、 parent moduleTreeWalker2、 xml 代码3.2.4.35 ExplicitInitialization检查类和对象成员是否初始化为默认值。211、 parent moduleTreeWalker2、 xml 代码3.2.4.36 DefaultComesLast检查 default 的 clause 是否在 switch 代码段的最后。1、 parent moduleTreeWalker2、 xml 代码3.2.4.37 MissingCtor检
28、查类是否自定义了构造函数,而不依赖默认的构造函数。1、 parent moduleTreeWalker2、 xml 代码3.2.4.38 FallThrough检查 switch 代码的 case 中是否缺少 break,return ,throw 和 continue。1、 PropertiescheckLastCaseGroup:是否要检查最后一个 case,默认为 falsereliefPattern:匹配正则表达式的不会引起警告。默认为”fallthru|falls? ?through”2、 parent moduleTreeWalker3、 xml 代码3.2.4.39 Multip
29、leStringLiterals检查一个文件中是否有多次出现的字符串。1、 PropertiesallowedDuplicates:允许重复出现的次数,默认为 1。ignoreStringsRegexp:忽略对匹配正则表达式的字符串的检查,默认为“$” ,即空字符串。ignoreOccurrenceContext:哪些字符串即使不匹配 ignoreStringsRegexp 也可以有重复。默认为ANNOTATION2、 parent moduleTreeWalker3、 xml 代码3.2.4.40 MultipleVariableDeclarations检查代码段和代码行中是否有多次变量声明
30、。1、 parent moduleTreeWalker2、 xml 代码3.2.4.41 RequireThis检查代码中是否有“this.”1、 PropertiescheckFields:是否要检查属性,默认为 truecheckMethods:是否要检查方法,默认为 true2、 parent moduleTreeWalker3、 xml 代码3.2.4.42 UnnecessaryParentheses检查是否有使用不需要的圆括号。1、 parent moduleTreeWalker2、 xml 代码3.2.5 Duplicate Code对 ctrl-c,ctrl-v 生成的代码进行
31、检查。233.2.5.1 StrictDuplicateCode一行一行的对比代码,若某些行仅仅缩进不同,则被认为是重复代码。import 语句会被忽略,其他语句都会检查。1、 Propertiesmin:最少多少行相同则被认为是重复的,默认为 12fileExtensions:待检查文件的扩展名。默认为空。2、 parent moduleChecker3、 xml 代码3.2.6 Headers3.2.6.1 Header对源文件的头部分格式内容进行检查。1、 PropertiesheaderFile:包含特定格式的文件头的文件。默认为为 null。charset:读取 headerFile
32、 时使用的字符集,默认为 Check 的 charset 属性值,即系统属性“file.encoding”的取值。header:特殊要求的内联的文件头的内容信息,各个行之间必须以”n” 分隔。默认为空。ignoreLines:忽略的行数。默认为空。fileExtensions:待处理的文件的扩展名。默认为空。2、 parent moduleChecker3、 xml 代码或3.2.6.2 RegexpHeaderHeader 中规定的是固定格式的文件头,RegexpHeader 使用正则表达式来对文件头信息进行验证。1、 PropertiesheaderFile:包含特定格式的文件头的文件。默
33、认为为 null。charset:读取 headerFile 时使用的字符集,默认为 Check 的 charset 属性值,即系统属性“file.encoding”的取值。header:特殊要求的内联的文件头的内容信息,各个行之间必须以”n” 分隔。默认为空。multiLines:重复的行号。默认为空。fileExtensions:待处理的文件的扩展名。默认为空。2、 parent moduleChecker3、 xml 代码或3.2.7 Imports3.2.7.1 AvoidStarImport检查确保没有使用星号的 import 语句。1、 Propertiesexcludes:哪些包
34、可以使用星号引入。默认为空。2、 parent moduleTreeWalker3、 xml 代码3.2.7.2 AvoidStaticImport检查确保米有静态引入的语句。1、 Properties25excludes:哪些可以静态引入,如,java.lang.Math.* , java.lang.System.out,java.lang.Math.random 。默认为空。2、 parent moduleTreeWalker3、 xml 代码3.2.7.3 IllegalImport检查是否 import 了违法的包。默认拒绝 import 所有 sun.*包。1、 Properties
35、illegalPkgs:拒绝的包名列表。默认为“sun”2、 parent moduleTreWalker3、 xml 代码3.2.7.4 RedundantImport对冗余的引入进行检查。以下三种情况被认为是荣誉的引用:(1)同一个类被引入了不止一次。(2)引入了包 java.lang 之哟,有引入了类 java.lang.String(3)引入同一个包下的类1、 parent moduleTreeWalker2、 xml 代码3.2.7.5 UnusedImports对是否有未使用的 import 进行检查。以下四种情况被认为是未使用的引入:(1)IDE 中队星号引入不支持(2)对同一个
36、类的多次引入(3)从 java.lang 中引入类(4)从同一个包中引入类1、 parent moduleTreeWalker2、 xml 代码3.2.7.6 ImportOrder对 import 的分组和顺序进行检查。有如下特点:(1)不同的组排雷顺序不同,如 java 第一,javax 第二,然后是其他的包。(2)各个组之间有分隔符,一般为一个空行(3)组内之间按字段顺序排列(4)组之间比较排列是大小写敏感的(5)对静态引入的 import 组来说,确保普通 import 和静态 import 的相关联顺序1、 Propertiesoption:静态 import 和普通 import
37、之间相应的位置关系。默认为 undertop:所有静态引入写在最上面。例如,import static a.b.C.*;import static x.y.Z.*;import a.b.D;import x.y.Z;above:静态引入写在所在组的上面,例如,import static a.b.C.*;import a.b.D;import static x.y.Z.*;import x.y.Z;inflow:对静态引入无特殊对待,例如,import static a.b.C.*;import a.b.D;import x.y.Z;import static x.y.Z.*;under:静态引
38、入写在所在组的上面,例如,import a.b.D;import static a.b.C.*;import x.y.Z;import static x.y.Z.*;bottom:所有静态引入写在最上面,例如,import a.b.D;import x.y.Z;import static a.b.C.*;import static x.y.Z.*;groups:import 的组列表,默认为空。27ordered:组内是否排序,默认为 trueseparated:组建是否分隔,至少一个空行,默认为 falsecaseSensitive:排序时的字符串比较是否大小写敏感。默认为 true。2、
39、parent moduleTreeWalker3、 xml 代码3.2.7.8 ImportControl控制可 import 的包。在一个较大的 project 可限制使用过多的第三方包,案发那个值应用层规则被破坏,通过一个依照 http:/ 的 xml 文件来指定。1、 Propertiesfile:import 控制配置文件的文件名。默认为 null。url:import 控制配置文件的 url 为 null。2、 parent moduleTreeWalker3、 xml 代码import 控制配置文件。3.2.8 Javadoc Comments3.2.8.1 JavadocPack
40、age检查每个 java 包是否都有一个 javadoc 文件来注释,默认仅仅可以使用 package-info.java,可以配置属性来允许使用 package.html 文件。1、 PropertiesallowLegacy:师傅哦允许使用 package.html 文件2、 parent modulChecker3、 xml 代码3.2.8.2 JavadocType对类和接口的 javadoc 注释进行检查。默认不检查 author 和 version 标签。1、 Propertiesscope:对 javadoc 注释中可见性的检查。 ,默认为 privateexcludeScope
41、:指定哪种 javadoc 注释中的可见性不检查。默认为 null。authorFormat:匹配author 标签的正则表达式、 。默认为 nullversionFormat:匹配version 标签的正则表达式。默认为 null。allowMissingParamTags:当类含有有类型参数时,在 javadoc 中是否可以没有 param 标签。默认为false。allowUnknownTags:javadoc 中是否可以有未知标签。默认为 false。tokens:哪些关键字的类型要检查,默认为 INTERFACE_DEF, CLASS_DEF。2、 parent moduleTree
42、Walker3、 xml 代码3.2.8.3 JavadocMethod检查方法和构造函数的 javadoc。默认不检查未使用的异常抛出。1、 Propertiesscope:scope:对 javadoc 注释中可见性的检查。 ,默认为 privateexcludes:哪些不检查。默认为 null。allowUndeclaredRTE:是否允许有未声明的运行时异常。默认为 false。allowThrowsTagsForSubclasses:是否允许定义一个已声明异常的子类,默认为 false。allowMissingParamTags:当一个方法有参数,在 javadoc 中却没有 par
43、am 标签时,是否忽略,默认为false。allowMissingReturnTag:当一个方法有一个有类型返回值时,在 javadoc 中却没有 return 标签时,是否忽略。默认为 false。allowMissingJavadoc:当一个方法没有 javadoc 时,是否忽略错误。默认为 false。allowMissingPropertyJavadoc:当缺少属性访问方法的 javadoc 时,是否忽略。默认为 false。logLoadErrors:这个检查会载入throws 标签提到的 exception 类,来检查它是否是运行时异常。若载入错误,该属性的设置会指定 checkstyle 的错误处理。若设置为 false,则认为是类路径配置错误,TreeWalker 完全停止对该类的操作。若设置为 true,则 checkstyle 认为是 javadoc 的错别字或重构时产生的