checkstyple





介绍 
CheckStyle是SourceForge下的一个项目,提供了一个帮助JAVA开发人员遵守某些编码规范的工具。它能够自动化代码规范检查过程,从 而使得开发人员从这项重要,但是枯燥的任务中解脱出来。 
CheckStyle默认提供一下主要检查内容: 
  •Javadoc注释 
  •命名约定 
  •标题 
  •Import语句 
  •体积大小 
  •空白 
  •修饰符 
   •块 
  •代码问题 
  •类设计 
  •混合检查(包活一些有用的比如非必须的 System.out和printstackTrace) 
  从上面可以看出,CheckStyle提供了大部分功能都是对于代码规范 的检查,而没有提供象PMD和Jalopy那么多的增强代码质量和修改代码的功能。但是,对于团队开发,尤其是强调代码规范的公司来说,它的功能已经足够强大。 
Eclipse插件安装和使用 
步骤一:http://sourceforge.net/projects/checkclipse/下载checkstyle的eclipse插件checkclipse。下载后,将包放入eclipse的plugins文件夹下,然后重启eclipse。在Windows—>preferences下找到checkclipse。如下图: 
 
勾选Set Project Dir as Checkjstyle Basedir 
步骤二:右键选中你要进行checkstyle的项目文件,选择“properties”。如下图: 
 
勾选Enable Checkstyle和Set Project ClassLoader. 
然后再Checkstyle Configuraion File中选择项目中checkstyle的配置文件。这里我把配置文件时放置在项目根目录下,所以点击右侧“Browse”按钮,在项目根目录下选择该文件。按“OK”按钮。 
这样整个项目的代码将根据配置文件中设置的原则进行出错提示.结果如下图: 
 
由图可知对不符合代码规范的代码会有错误提示,并且有提示信息。 
Maven插件安装和使用 
首先,修改要检查代码库top级的pom.xml文件,在build部分配置CheckStyle的Maven插件,以便于下载安装对应版本的插件(Maven会自动从其镜像库中下载),方法如下: 

Java代码   收藏代码
  1. <project>  
  2.   ...  
  3.   <build>  
  4.     <plugins>  
  5.       <plugin>  
  6.         <groupId>org.apache.maven.plugins</groupId>  
  7.         <artifactId>maven-checkstyle-plugin</artifactId>  
  8.         <version>2.3</version>  
  9.       </plugin>  
  10.     </plugins>  
  11.   </build>  
  12.   ...  
  13. </project>  

maven-checkstyle-plugin的最新版本为2.5,其对应的CheckStyle核心版本为5.0;maven-checkstyle-plugin 2.3对应的CheckStyle核心版本为4.4。查看插件的pom文件,可看到如下内容,其中的版本号就为对应的CheckStyle的版本号。 
Java代码   收藏代码
  1. <dependency>  
  2.   <groupId>checkstyle</groupId>   
  3.   <artifactId>checkstyle</artifactId>   
  4.   <version>4.4</version>   
  5.   </dependency>  

接下来,将自定义的规则配置文件拷贝到top级目录,在reporting部分的CheckStyle插件配置中引用配置。 
Java代码   收藏代码
  1. <reporting>  
  2.     <plugins>  
  3.         <plugin>  
  4.             <groupId>org.apache.maven.plugins</groupId>  
  5.             <artifactId>maven-checkstyle-plugin</artifactId>  
  6.             <configuration>  
  7.               <configLocation>my_checks.xml</configLocation>  
  8.             </configuration>  
  9.         </plugin>  
  10.     </plugins>  
  11. </reporting>  

也可以将配置文件放在子文件夹下,配置中带上相对路径即可。 
Java代码   收藏代码
  1. <reporting>  
  2.     <plugins>  
  3.         <plugin>  
  4.             <groupId>org.apache.maven.plugins</groupId>  
  5.             <artifactId>maven-checkstyle-plugin</artifactId>  
  6.             <configuration>  
  7.               <configLocation>build-tools/src/main/resources/xx/my_checks.xml</configLocation>  
  8.             </configuration>  
  9.         </plugin>  
  10.     </plugins>  
  11. </reporting>  

如果使用插件自带的规则文件,可以作如下配置。maven-checkstyle-plugin插件自带的规则有sun_checks.xml、maven_checks.xml等,可查看插件包。 
Java代码   收藏代码
  1. <reporting>  
  2.     <plugins>  
  3.                <plugin>  
  4.                  <groupId>org.apache.maven.plugins</groupId>  
  5.                  <artifactId>maven-checkstyle-plugin</artifactId>  
  6.                  <configuration>  
  7.                             <configLocation>config/maven_checks.xml</configLocation>  
  8.                 </configuration>  
  9.                  <version>2.3</version>         
  10.                </plugin>  
  11.     </plugins>  
  12. </reporting>  

在reporting部分增加jxr插件,生成代码报告,这样在CheckStyle报告 中点击问题对应的链接就可以直接看到出错的代码。 
     
Java代码   收藏代码
  1. <reporting>  
  2.           <plugins>  
  3.             <plugin>  
  4.               <groupId>org.apache.maven.plugins</groupId>  
  5.               <artifactId>maven-checkstyle-plugin</artifactId>  
  6.               <configuration>  
  7.                          <configLocation>my_checks.xml</configLocation>                              
  8.           </configuration>  
  9.               <version>2.3</version>         
  10.             </plugin>  
  11.             <plugin>  
  12.                    <groupId>org.apache.maven.plugins</groupId>  
  13.                  <artifactId>maven-jxr-plugin</artifactId>  
  14.             </plugin>                
  15.           </plugins>  
  16.     </reporting>   
           
在build和reporting部分增加javadoc插件,如果pom文件中已经配置,则只需作相应修改。charset、encoding、docencoding配置用于解决生成的javadoc文件中文乱码问题;aggregate配置为true则javadoc报告会集中显示所有子模块的javadoc。 
       
Java代码   收藏代码
  1. <reporting>  
  2.             <plugins>  
  3.               <plugin>  
  4.                           <groupId>org.apache.maven.plugins</groupId>  
  5.                           <artifactId>maven-javadoc-plugin</artifactId>  
  6.                           <version>2.4</version>  
  7.                           <configuration>  
  8.                              <aggregate>true</aggregate>  
  9.                         <charset>UTF-8</charset>  
  10.                                       <encoding>UTF-8</encoding>  
  11.                                       <docencoding>UTF-8</docencoding>  
  12.                         </configuration>  
  13.               </plugin>              
  14.               <plugin>  
  15.                 <groupId>org.apache.maven.plugins</groupId>  
  16.                 <artifactId>maven-checkstyle-plugin</artifactId>  
  17.                 <configuration>  
  18.                            <configLocation>my_checks.xml</configLocation>                              
  19.             </configuration>  
  20.                 <version>2.3</version>         
  21.               </plugin>  
  22.               <plugin>  
  23.                      <groupId>org.apache.maven.plugins</groupId>  
  24.                    <artifactId>maven-jxr-plugin</artifactId>  
  25.               </plugin>                
  26.             </plugins>  
  27.       </reporting>  

在maven插件中使用 install命令将pom文件中配置的插件下载安装到本地,然后使用checkstyle:checkstyle命令进行检查并生成报告,运行完毕,各项目目录下会生成target目录,target\site\checkstyle.html即为该项目的问题报告。 
需要注意的是checkstyle:checkstyle仅生成CheckStyle相关报告,因此不能从报告中直接链接到错误代码;需要同时生成jxr源代码,使用site。 
如果运行checkstyle:checkstyle或site过程中出现如下错误,则应该修改CheckStyle规 则配置文件,去除其中的中文字符。 
Java代码   收藏代码
  1. “[ERROR] BUILD ERROR  
  2. [INFO] ------------------------------------------------------------------------  
  3. [INFO] An error has occurred in Checkstyle report generation.  
  4.    
  5. Embedded error: Failed during checkstyle configuration  
  6. Invalid byte 1 of 1-byte UTF-8 sequence.  
  7. ”  

最佳实践 
自定义的checkstyle配置文件 
  以下代码是自定义的checkstyle配置文件内容,相关说明都已经用注释形式写在文件中。代码如下: 
Java代码   收藏代码
  1. <!DOCTYPE module PUBLIC  
  2.     "-//Puppy Crawl//DTD Check Configuration 1.2//EN"  
  3.     "http://www.puppycrawl.com/dtds/configuration_1_2.dtd">  
  4. <module name="Checker">  
  5.   
  6.     <!--  
  7.         重复代码的检查,超过8行就认为重复,UTF-8格式 本检查一定要放在"TreeWalker"节点前,否则在  
  8.         Checkclipse中会无法使用。(在ant下可以)  
  9.     -->  
  10.     <module name="StrictDuplicateCode">  
  11.         <property name="min" value="8" />  
  12.         <property name="charset" value="UTF-8" />  
  13.     </module>  
  14.   
  15.     <module name="TreeWalker">  
  16.   
  17.         <!-- javadoc的检查 -->  
  18.         <!-- 检查所有的interfaceclass -->  
  19.         <module name="JavadocType" />  
  20.   
  21.         <!-- 命名方面的检查,它们都使用了Sun官方定的规则。 -->  
  22.         <!-- 局部的final变量,包括catch中的参数的检查 -->  
  23.         <module name="LocalFinalVariableName" />  
  24.         <!-- 局部的非final型的变量,包括catch中的参数的检查 -->  
  25.         <module name="LocalVariableName" />  
  26.         <!-- 包名的检查(只允许小写字母) -->  
  27.         <module name="PackageName">  
  28.             <property name="format" value="^[a-z]+(\.[a-z][a-z0-9]*)*$" />  
  29.         </module>  
  30.         <!-- 仅仅是static型的变量(不包括static final型)的检查 -->  
  31.         <module name="StaticVariableName" />  
  32.         <!-- 类型(Class或Interface)名的检查 -->  
  33.         <module name="TypeName" />  
  34.         <!-- 非static型变量的检查 -->  
  35.         <module name="MemberName" />  
  36.         <!-- 方法名的检查 -->  
  37.         <module name="MethodName" />  
  38.         <!-- 方法的参数名 -->  
  39.         <module name="ParameterName " />  
  40.         <!-- 常量名的检查 -->  
  41.         <module name="ConstantName" />  
  42.   
  43.         <!-- import方面的检查 -->  
  44.         <!-- import中避免星号"*" -->  
  45.         <module name="AvoidStarImport" />  
  46.         <!--  
  47.             没用的import检查,比如:1.没有被用到2.重复的3.import java.lang的4.import  
  48.             与该类在同一个package的  
  49.         -->  
  50.         <module name="UnusedImports" />  
  51.   
  52.   
  53.         <!-- 长度方面的检查 -->  
  54.         <!-- 文件长度不超过1500行 -->  
  55.         <module name="FileLength">  
  56.             <property name="max" value="1500" />  
  57.         </module>  
  58.         <!-- 每行不超过120个字-->  
  59.         <module name="LineLength">  
  60.             <property name="max" value="120" />  
  61.         </module>  
  62.         <!-- 方法不超过30行 -->  
  63.         <module name="MethodLength">  
  64.             <property name="tokens" value="METHOD_DEF" />  
  65.             <property name="max" value="30" />  
  66.         </module>  
  67.         <!-- 方法的参数个数不超过3个。 并且不对构造方法进行检查-->  
  68.         <module name="ParameterNumber">  
  69.             <property name="max" value="3" />  
  70.             <property name="tokens" value="METHOD_DEF" />  
  71.         </module>  
  72.   
  73.         <!-- 空格检查  -->  
  74.         <!-- 允许方法名后紧跟左边圆括号"(" -->  
  75.         <module name="MethodParamPad" />  
  76.         <!-- 在类型转换时,不允许左圆括号右边有空格,也不允许与右圆括号左边有空格 -->  
  77.         <module name="TypecastParenPad" />  
  78.         <!-- 不允许使用"tab"键  -->  
  79.         <module name="TabCharacter" />  
  80.   
  81.         <!-- 关键字 -->  
  82.         <!--  
  83.             每个关键字都有正确的出现顺序。比如 public static final XXX 是对一个常量的声明。如果使用 static  
  84.             public final 就是错误的  
  85.         -->  
  86.         <module name="ModifierOrder" />  
  87.         <!-- 多余的关键字 -->  
  88.         <module name="RedundantModifier" />  
  89.   
  90.         <!-- 对区域的检查 -->  
  91.         <!-- 不能出现空白区域 -->  
  92.         <module name="EmptyBlock" />  
  93.         <!-- 所有区域都要使用大括号。 -->  
  94.         <module name="NeedBraces" />  
  95.         <!-- 多余的括号 -->  
  96.         <module name="AvoidNestedBlocks">  
  97.             <property name="allowInSwitchCase" value="true" />  
  98.         </module>  
  99.   
  100.         <!-- 编码方面的检查 -->  
  101.         <!-- 不许出现空语句 -->  
  102.         <module name="EmptyStatement" />  
  103.         <!-- 每个类都实现了equals()和hashCode() -->  
  104.         <module name="EqualsHashCode" />  
  105.         <!-- 不许使用switch,"a++"这样可读性很差的代码 -->  
  106.         <module name="IllegalToken" />  
  107.         <!-- 不许内部赋值 -->  
  108.         <module name="InnerAssignment" />  
  109.         <!-- 绝对不能容忍魔法数 -->  
  110.         <module name="MagicNumber">  
  111.             <property name="tokens" value="NUM_DOUBLE, NUM_INT" />  
  112.         </module>  
  113.         <!-- 循环控制变量不能被修改 -->  
  114.         <module name="ModifiedControlVariable" />  
  115.         <!-- 多余的throw -->  
  116.         <module name="RedundantThrows" />  
  117.         <!-- 不许使用未被简化的条件表达式 -->  
  118.         <module name="SimplifyBooleanExpression" />  
  119.         <!-- 不许使用未被简化的布尔返回值 -->  
  120.         <module name="SimplifyBooleanReturn" />  
  121.         <!-- String的比较不能用!= 和 == -->  
  122.         <module name="StringLiteralEquality" />  
  123.         <!-- if最多嵌套3层 -->  
  124.         <module name="NestedIfDepth">  
  125.             <property name="max" value="3" />  
  126.         </module>  
  127.         <!-- try最多被嵌套2层 -->  
  128.         <module name="NestedTryDepth">  
  129.             <property name="max" value="2" />  
  130.         </module>  
  131.         <!-- clone方法必须调用了super.clone() -->  
  132.         <module name="SuperClone" />  
  133.         <!-- finalize 必须调用了super.finalize() -->  
  134.         <module name="SuperFinalize" />  
  135.         <!-- 不能catch java.lang.Exception -->  
  136.         <module name="IllegalCatch">  
  137.             <property name="illegalClassNames" value="java.lang.Exception" />  
  138.         </module>  
  139.         <!-- 确保一个类有package声明 -->  
  140.         <module name="PackageDeclaration" />  
  141.         <!-- 一个方法中最多有3return -->  
  142.         <module name="ReturnCount">  
  143.             <property name="max" value="3" />  
  144.             <property name="format" value="^$" />  
  145.         </module>  
  146.         <!--  
  147.             根据 Sun 编码规范, class 或 interface 中的顺序如下: 1.class 声明。首先是 public,  
  148.             然后是protected , 然后是 package level (不包括access modifier ) 最后是private .  
  149.             (多个class放在一个java文件中的情况) 2.变量声明。 首先是 public, 然后是protected然后是 package  
  150.             level (不包括access modifier ) 最后是private . (多个class放在一个java文件中的情况)  
  151.             3.构造函数 4.方法  
  152.         -->  
  153.         <module name="DeclarationOrder" />  
  154.         <!-- 不许对方法的参数赋值 -->  
  155.         <module name="ParameterAssignment" />  
  156.         <!-- 确保某个class 在被使用时都已经被初始化成默认值(对象是null,数字和字符是0,boolean 变量是false.) -->  
  157.         <module name="ExplicitInitialization" />  
  158.         <!-- 不许有同样内容的String -->  
  159.         <module name="MultipleStringLiterals" />  
  160.         <!-- 同一行不能有多个声明 -->  
  161.         <module name="MultipleVariableDeclarations" />  
  162.         <!-- 不必要的圆括号 -->  
  163.         <module name="UnnecessaryParentheses" />  
  164.   
  165.         <!-- 各种量度 -->  
  166.         <!-- 布尔表达式的复杂度,不超过3 -->  
  167.         <module name="BooleanExpressionComplexity" />  
  168.         <!-- 类数据的抽象耦合,不超过7 -->  
  169.         <module name="ClassDataAbstractionCoupling" />  
  170.         <!-- 类的分散复杂度,不超过20 -->  
  171.         <module name="ClassFanOutComplexity" />  
  172.         <!-- 函数的分支复杂度,不超过10 -->  
  173.         <module name="CyclomaticComplexity" />  
  174.         <!-- NPath复杂度,不超过200 -->  
  175.         <module name="NPathComplexity" />  
  176.   
  177.         <!-- 杂项 -->  
  178.         <!-- 禁止使用System.out.println -->  
  179.         <module name="GenericIllegalRegexp">  
  180.             <property name="format" value="System\.out\.println" />  
  181.             <property name="ignoreComments" value="true" />  
  182.         </module>  
  183.           
  184.         <!-- 不许使用main方法 -->  
  185.         <module name="UncommentedMain" />  
  186.         <!-- 检查并确保所有的常量中的L都是大写的。因为小写的字母l跟数字1太象了 -->  
  187.         <module name="UpperEll" />  
  188.         <!-- 检查数组类型的定义是String[] args,而不是String args[] -->  
  189.         <module name="ArrayTypeStyle" />  
  190.         <!--  
  191.             检查java代码的缩进 默认配置:基本缩进 4个空格,新行的大括号:0。新行的case 4个空格。  
  192.         -->  
  193.         <module name="Indentation" />  
  194.     </module>  
  195.   
  196.     <!-- 检查翻译文件     -->  
  197.     <module name="Translation" />  
  198. </module>  

CheckStyle应用的最佳实践 
  采用CheckStyle以后,编码规范的检查就变得及其简单,可以作为一项切实可行的实践加以执行。 
  一般情况下,在项目小组中引入CheckStyle可以按照下面的步骤进行: 
  1. 强调Code Review与Code Conventions的重要作用; 
  2. 介绍CheckStyle; 
    3. 初步应用CheckStyle:参照CheckStyle附带的配置文件,酌情加以剪裁,在项目的Maven配置文件中,添加CheckStyle任务,可以 单独执行; 
  4. 修改、定型CheckStyle的配置文件:按照基本配置文件执行一段时间(2~3周),听取开发人员的反馈意见,修改配置信息; 
  5. 作为开发过程的日常实践,强制执行CheckStyle:稳定CheckStyle的配置信息,同时将CheckStyle任务作为Build的依赖任务 或者配置SCM(目前,CheckStyle可以与SVN有效集成),使得代码在加入系统 之前必须通过检查。 
  同时需要指出的是,CheckStyle的有效执行需要依赖的条件: 
    •IDE Format Code的强大功能:由于CheckStyle本身并没有提供很强大的Code Format等功能,因此,需要借助IDE的帮助,从而使得在发生错误的时候,可以很容易的进行修复。 
IDE格式配置使用介绍 
在eclipse中的windowpreferencesjavacode style中可以导入自定义的java编码风格文件。如下图: 
 
点击“Clean Up”,在右侧可以看见一个Import按钮,导入自定义的cleanup文件,点击“OK”即可。左侧的“Formatter”也是如法炮制。具体自定义的checkstyle,cleanup,formatter文件可参考压缩包文件中的公司代码规范文件夹。 












属性 说明
basedir 代码所在的位置
AbstractClassName format: 定义抽象类的命名规则
PackageName format: 定义包名的命名规则
TypeName format: 定义类和接口的命名规则
tokens: 定义规则适用的类型,例如:CLASS_DEF表示类,INTERFACE_DEF 表示接口
ParameterName format: 定义参数名的命名规则
ParameterNumber max: 定义最多有多少个参数
tokens: 定义检查的类型
StaticVariableName format: 定义静态变量的命名规则
MethodName format: 定义方法名的命名规则
LeftCurly option: 定义左大括号'{'显示位置,eol在同一行显示,nl在下一行显示
maxLineLength: 大括号'{'所在行行最多容纳的字符数
tokens: 该属性适用的类型,例:CLASS_DEF,INTERFACE_DEF,METHOD_DEF,CTOR_DEF
LineLength max: 定义一行所能容许的字符数
ignorePattern: 定义可以忽略的格式
MethodLength 检查方法的行数
max: 最多容许的行数
countEmpty: 是否计算空行
tokens: 定义检查的类型
RightCurly option: 右大括号是否单独一行显示
tokens: 定义检查的类型
PackageHtml 检查对每一个包是否生成了package.html文件
fileExtensions: 指定要检查的文件的类型,如果只包含java文件,就不必指定
JavadocType 检查类或者接口的javadoc注释
authorFormat: 检查author标签的格式
versionFormat: 检查version标签的格式
scope: 可以检查的类的范围,例如:public只能检查public修饰的类,private可以检查所有的类
excludeScope: 不能检查的类的范围,例如:public,public的类将不被检查,但访问权限小于public的类仍然会检查,其他的权限以此类推
tokens: 该属性适用的类型,例如:CLASS_DEF,INTERFACE_DEF
JavadocMethod 检查方法的javadoc的注释
scope: 可以检查的方法的范围,例如:public只能检查public修饰的方法,private可以检查所有的方法
allowMissingParamTags: 是否忽略对参数注释的检查
allowMissingThrowsTags: 是否忽略对throws注释的检查
allowMissingReturnTag: 是否忽略对return注释的检查
JavadocVariable 检查类变量的注释
scope: 检查变量的范围,例如:public只能检查public修饰的变量,private可以检查所有的变量
JavadocStyle scope: 
excludeScope: 
checkFirstSentence: 
checkEmptyJavadoc: 
checkHtml: 
tokens:
LocalVariableName format: 定义局部变量的命名规则
LocalFinalVariableName format: 定义局部常量的命名规则
ConstantName format: 定义全局常量的命名规则
MemberName format: 定义非静态成员变量的命名规则
applyToPublic: 是否适用于public的成员变量
applyToProtected: 是否适用于protected的成员变量
applyToPackage: 是否适用于package的成员变量
applyToPrivate: 是否适用于private的成员变量
AvoidStarImport 必须导入类的完整路径,即不能使用*导入所需的类
excludes: 定义可以使用*导入的包
ImportOrder 定义导入包的顺序
groups: 定义导入包的顺序,默认以字母顺序导入
ordered: 定义包是否必须按规定的顺序显示
separated: 定义包与包之间是否应添加空白行
caseSensitive: 是否区分包名的大小写
IllegalImport 检查是否从非法的包中导入了类
illegalPkgs: 定义非法的包名称
UnusedImports 检查是否导入的包没有使用
RedundantImport 检查是否导入了不必显示导入的类
EmptyForInitializerPad 检查for语句初始化变量的格式
option: 定义初始化语句中是否使用空格,例如:space表示使用空格,则for(int i = 0; i < 100; i++)就是符合格式要求的,而for(int i=0; i<100;i++)就不符合要求
EmptyForIteratorPad 检查for iterator语句是否使用空格
option: 定义初始化语句是否使用空格,例如:space表示使用空格,则for(Iterator iterator = List.iterator(); iterator.hasNext(); iterator.next())就是形式合理的,否则就是形式不合理的
ExecutableStatementCount 检查要执行的语句的数目
max: 定义所能容许的语句的最多数目
tokens: 定义可以检查的类型,例如:CTOR_DEF,METHOD_DEF,STATIC_INIT,INSTANCE_INIT
FileLength max: 定义一个文件所能容许的行数
AnonInnerLength 检查匿名内部类
max: 定义匿名内部类最多容许的行数
MethodParamPad 检查方法参数的格式
allowLineBreaks: 参数是否允许在不同行(注:没有作用)
option: 在参数和括号、参数和标识符之间是否包含空格
OperatorWrap 检查运算符是否在应在同一行
option: 定义运算符的位置,eol在同一行,nl在下一行
tokens: 定义检查的类型
ParenPad 检查左小括号'('后边和右小括号')'前边是否有空格
option: space表示有空格,nospace表示没有空格
tokens: 定义检查的类型
TypecastParenPad 暂不清楚
TabCharacter 检查源码中是否包含\t
WhitespaceAfter 检查类型后是否包含空格
tokens: 检查的类型
WhitespaceAround 暂不清楚
ModifierOrder 检查修饰符的顺序,默认是 public,protected,private,abstract,static,final,transient,volatile,synchronized,native,strictfp(注:定义不起作用)
RedundantModifier 检查是否有多余的修饰符,例如:接口中的方法不必使用public、abstract修饰
tokens: 检查的类型
EmptyBlock 检查是否有空代码块
option: 定义代码块中应该包含的内容,例如:stmt表示语句
tokens: 检查的类型
NeedBraces 检查是否应该使用括号的地方没有加括号
tokens: 定义检查的类型
AvoidNestedBlocks 检查是否有嵌套的代码块
allowInSwitchCase: 定义是否允许switch case中使用嵌套的代码块
ArrayTrailingComma 检查初始化数祖时,最后一个元素后面是否加了逗号,如果左右大括号都在同一行,则可以不加逗号
AvoidInlineConditionals 检查是否在同一行初始化, 例如:private int Age = nGe==1 ? 100 : 0; 就应该避免
CovariantEquals 暂不清楚
ModifiedControlVariable 检查循环控制变量是否被修改
SimplifyBooleanExpression 检查是否有boolean使用冗余的地方,例如:b == true、b || true,应该简化为 b、b
SimplifyBooleanReturn 检查是否在返回boolean值时是否有使用冗余的地方,例如:
    if(valid())
        return true;
    else
        return false;
应该改为:
    return valid();
StringLiteralEquality 检查在判断字符串是否相等时是否使用了正确的形式
EqualsHashCode 检查在重写了equals方法后是否重写了hashCode方法
FinalLocalVariable 检查变量值没有改动的情况下,该变量是否定义成了final
MissingSwitchDefault 检查switch语句是否忘记了default标签
RedundantThrows 检查是否抛出了多余的异常
DefaultComesLast 检查switch中default是否在所有case的后面
MissingCtor 检查类中是否显式定义了构造器
FallThrough 检查switch中case后是否加入了跳出语句,例如:return、break、throw、continue
MultipleStringLiterals 检查一个字符串变量在不改变变量值的情况下或者字符串出现的次数
allowedDuplicates: 定义在类中一个字符串变量在不改变变量值的情况下或者字符串所能使用的最多次数
MultipleVariableDeclarations 检查一次声明多个变量时,变量是否在同一行或者在同一个语句中
RequireThis 检查是否使用了this
checkFields: 是否检查变量引用
checkMethods: 是否检查方法调用
UnnecessaryParentheses 检查是否使用了多余的小括号
VisibilityModifier 检查变量是否对外部可见
packageAllowed: 变量包内成员可以访问
protectedAllowed: 变量是受保护的
publicMemberPattern: 可以公开访问的变量所匹配的命名形式
FinalClass 只有私有构造器的类必须声明为final
InterfaceIsType 检查接口是否只定义了变量而没有定义方法,因为接口应该用来描述一个类型,所以只定义变量而不定义方法是不恰当的
allowMarkerInterfaces: 是否检查空接口
HideUtilityClassConstructor 只定义了静态方法的类不应该定义一个公有的构造器
DesignForExtension 检查类是否被设计为可扩展的,如果是,则方法应该abstract、final或者是空的
ThrowsCount 检查抛出异常的数量
max: 定义抛出异常的最大数目
StrictDuplicateCode 检查类中是否有代码复制的问题
min: 允许代码重复的最小行数
charset: 文件所用的字符集
BooleanExpressionComplexity max: 布尔运算符在一条语句中允许出现的最大数目
GenericIllegalRegexp 检查代码中是否有不合适的引用形式或者字符
format: 定义检查所匹配的类型
ignoreCase: 是否区分大小写
ignoreComments: 是否忽略注释
message: 出现问题应该显示给用户的信息
NewlineAtEndOfFile 检查文件是否以一个新行结束
lineSeparator: 行分隔符的类型,windows是crlf
UncommentedMain 检查是否有没有被注掉或者删除的main方法
excludedClasses: 定义可以带main方法的类所匹配的名字形式
UpperEll 检查初始化长整型变量时,数字後是加了大写字母'L'而不是小写字母'l'
ArrayTypeStyle 检查再定义数组时,采用java风格还是c风格,例如:int[] num是java风格,int num[]是c风格
javaStyle: 定义是否采用java风格定义数组
FinalParameters 检查参数是否是常量
tokens: 定义检查的类型
Indentation 检查代码的缩进是否符合要求
basicOffset: 定义代码体相对于所属的代码体的缩进量
braceAdjustment: 定义括号的缩进量
caseIndent: 定义case的缩进量
RequiredRegexp 检查文件中是否存在相应的文字
format: 定义所匹配的形式
usage.OneMethodPrivateField 检查是否只有一个方法访问了私有变量
ignoreFormat: 定义可以忽略的变量所匹配的命名形式
usage.UnusedLocalVariable 检查是否有命名後没有使用的变量
ignoreFormat: 定义可以忽略的变量所匹配的命名形式
usage.UnusedParameter 检查是否有没有使用的参数
ignoreFormat: 定义可以忽略的变量所匹配的命名形式
ignoreCatch: 是否忽略catch中的参数
ignoreNonLocal: 是否忽略非本地的变量
usage.UnusedPrivateField 检查是否存在未被使用的私有成员变量
ignoreFormat: 定义可以忽略的变量所匹配的命名形式
usage.UnusedPrivateMethod 检查是否存在未被使用的私有方法
ignoreFormat: 定义可以忽略的变量所匹配的命名形式



ParameterAssignment

说明:禁止对参数变量进行赋值

配置:

<module name="ParameterAssignment">
  <property name="severity" value="warning"/>
</module>

代码示例:

public void test1(int a) {
  a = 1; //报检查错误
}

提示信息:

Parameter Assigment: Assigment of parameter 'a' is not allowed.

SimplifyBooleanExpression

说明:简化boolean比较表达式

配置:

<module name="SimplifyBooleanExpression">
  <property name="severity" value="warning"/>
</module>

问题代码示例:

        public void test2() {
                boolean flag = false;
                if(flag == true) { //报检查错误
                        
                }
        }

提示信息:

Simplify Boolean Expression: Expression can be simplified.

正确代码示例:

        public void test2() {
                boolean flag = false;
                if(flag) {
                        
                }
        }

StaticVariableName

说明:非final静态变量名 ^[a-z][a-zA-Z0-9]*$ 

配置:

    <module name="StaticVariableName">
      <property name="severity" value="warning"/>
    </module>

问题代码示例:

private static int Htc = 1; //报检查错误

提示信息:

Static VariableName: Name 'Htc' must be match pattern '^[a-z][a-zA-Z0-9]*$'

正确代码示例:

private static int htc = 1;

ModifierOrder

说明:根据Java Language specification, sections 8.1.1, 8.3.1 and 8.4.3的建议检查修饰符排列顺序,建议顺序为: 

1.public
2.protected
3.private
4.abstract
5.static
6.final
7.transient
8.volatile
9.synchronized
10.native
11.strictfp

配置:

    <module name="ModifierOrder">
      <property name="severity" value="info"/>
    </module>

问题代码示例:

        private static int Htc = 1;
        public static final  int NUM = 1; //检查错误

提示信息:

Declaration Order Check: Variable access definition in wrong order.

正确代码示例:

        public static final  int NUM = 1;
        private static int htc = 1;

MethodName

说明:方法名 ^[a-z][a-zA-Z0-9]*$ 

配置:

    <module name="MethodName">
      <property name="severity" value="warning"/>
    </module>

问题代码示例:

        public void Test3() { //检查报错
                
        }

提示信息:

Method Names: Name 'Test3' must be match pattern '^[a-z][a-zA-Z0-9]*$'

正确代码示例

        public void test3() { 
                
        }

FinalClass

说明:检查含有private的final属性的类,是否具有是final类 

官方原文:Checks that a class which has only private constructors is declared as final.

配置:

    <module name="FinalClass">
      <property name="severity" value="warning"/>
    </module>

问题代码示例:

public class Test { //检查错误
        private final int dat = 1;

提示信息:

Final Class: Test should be declared as final.

正确代码示例:

public final class Test {
        private final int dat = 1;

EmptyStatement

说明: 检查无效语句(单独具有';') 

官方原文:Detects empty statements (standalone ';').

配置:

    <module name="EmptyStatement">
      <property name="severity" value="info"/>
    </module>

问题代码示例:

        public void test4() {
                if(true); //if语句后的';'号引起检查错误
                        doConditionalStuff();
                doUnconditionalStuff();
        }

提示信息:

Empty Statement: Empty Statement

正确代码示例:

        public void test4() {
                if(true)
                        doConditionalStuff();
                doUnconditionalStuff();
        }

InnerAssignment

说明: 内部赋值检查 

官方原文:Checks for assignments in subexpressions.

配置:

    <module name="InnerAssignment">
      <property name="severity" value="warning"/>
    </module>

带参数配置:

    <module name="InnerAssignment">
      <property name="tokens" value="ASSIGN,PLUS_ASSIGN,MINUS_ASSIGN"/>
    </module>

配置参数说明:

名称 描述 类型 默认值
tokens 指定检查运算符 subset of tokens ASSIGN, BAND_ASSIGN, BOR_ASSIGN, BSR_ASSIGN, BXOR_ASSIGN, DIV_ASSIGN, MINUS_ASSIGN, MOD_ASSIGN, PLUS_ASSIGN, SL_ASSIGN, SR_ASSIGN, STAR_ASSIGN 所有运算符

问题代码示例:

        public void test5() {
                int i = 0;
                String s = Integer.toString(i = 2); //检查错误
        }

提示信息:

Inner Assigment: Inner assigments should be avoided.

正确代码示例:

        public void test5() {
                int i = 0;
                i = 2;
                String s = Integer.toString(i);
        }

DoubleCheckedLocking

说明: 检查双重检查锁定DCL 

官方原文:The "double-checked locking" idiom (DCL) tries to avoid the runtime cost of synchronization.

配置:

    <module name="DoubleCheckedLocking">
      <property name="severity" value="warning"/>
    </module>

问题代码示例:

class DCLTest {
        private Helper helper = null;
        public Helper getHelper() {
                if (helper == null)
                        synchronized (this) {
                                if (helper == null) //检查错误
                                        helper = new Helper();
                        }
                return helper;
        }
}

提示信息:

Double Check Locking: The double-checked locking idiom is broken and should be avoided.

正确代码示例:

class DCLTest {
        private Helper helper = null;
        public synchronized Helper getHelper() {
                if (helper == null)
                        helper = new Helper();
                return helper;
        }
}

参考文档:

10 UnusedImports

说明: 未使用的import检查 

官方原文:Checks for unused import statements.

配置:

    <module name="UnusedImports">
      <property name="severity" value="info"/>
    </module>

问题代码示例:

import java.util.HashMap;  //当导入的包没有被使用时,会有检查错误

提示信息:

Unused Imports: Unused import - java.util.HashMap

当导入的包被使用后,检查错误消失

11 StringLiteralEquality

说明: 检查进行字符串比较时,不能用==或者!=,应该用equals 

官方原文:Checks that string literals are not used with == or !=.

配置:

    <module name="StringLiteralEquality">
      <property name="severity" value="warning"/>
    </module>

问题代码示例:

        public void test6() {
                String str = "abc";
                if(str == "cde") { //检查错误
                        
                }
        }

提示信息:

String Literal Equality: Literal Strings should be compared using equals(), not '=='

正确代码示例:

        public void test6() {
                String str = "abc";
                if("cde".equals(str)) {
                        
                }
        }

12 RedundantModifier

说明: 检查接口和注解类中重复定义的修饰符 比如:

接口中的属性和方法已经自动为public,就无需重复再用public修饰符 

注解中的属性已经自动为abstract和public,就无需重复再用public、abstract修饰符 

final类中的方法已经自动为final类型,就无需重复在方法前加final 

官方原文:Checks for redundant modifiers in interface and annotation definitions. Also checks for redundant final modifiers on methods of final classes.

Rationale: The Java Language Specification strongly discourages the usage of "public" and "abstract" for method declarations in interface definitions as a matter of style.

Variables in interfaces and annotations are automatically public, static and final, so these modifiers are redundant as well.

As annotations are a form of interface, their fields are also automatically public, static and final just as their annotation fields are automatically public and abstract.

Final classes by definition can not be extended so the final modifier on the method of a final class is redundant.

配置:

    <module name="RedundantModifier">
      <property name="severity" value="info"/>
    </module>

问题接口示例:

public interface InterfaceTest {
        
        static int A = 1; //检查错误
        
        final int B = 2; //检查错误
        
        public int C = 3; //检查错误
        
        /**
         * 
         */
        public  void test(); //检查错误
        
}

提示信息:

Redundant Modifier: Redundant 'static' modifier
Redundant Modifier: Redundant 'final' modifier
Redundant Modifier: Redundant 'public' modifier
Redundant Modifier: Redundant 'public' modifier

正确接口示例:

public interface InterfaceTest {
        
        int A = 1; 
        
        int B = 2; 
        
        int C = 3; 
        
        /**
         * 
         */
        void test(); 
        
}

问题注解示例:

public @interface AnnotationTest {
        /**
         * @return
         */
        abstract int test(); //检查错误
        
        /**
         * @return
         */
        public int test1(); //检查错误
        
}

提示信息:

Redundant Modifier: Redundant 'abstract' modifier
Redundant Modifier: Redundant 'public' modifier

正确注解示例:

public @interface AnnotationTest {
        /**
         * @return
         */
        int test(); 
        
        /**
         * @return
         */
        int test1(); 
        
}

问题Final类示例:

public final class FinalClass {
        
        /**
         * 
         */
        public final void test() { //检查错误
                
        }
}

提示信息:

Redundant Modifier: Redundant 'final' modifier

正确Final类示例:

public final class FinalClass {
        
        /**
         * 
         */
        public void test() {
                
        }
}

13 RedundantThrows

说明: 检查多余的抛出异常声明,未检查异常或者父类声明异常

官方原文:Checks for redundant exceptions declared in throws clause such as duplicates, unchecked exceptions or subclasses of another declared exception.

配置:

    <module name="RedundantThrows">
      <property name="severity" value="info"/>
    </module>

配置参数说明:

名称 描述 类型 默认值
allowUnchecked 是否允许在抛出异常声明中定义未检查异常 boolean false
allowSubclasses whether subclass of another declared exception is allowed in throws clause boolean false
logLoadErrors This check may need to load exception classes mentioned in the @throws tag to check whether they are RuntimeExceptions. If loading the class fails, this property allows to control checkstyle's error handling. If set to false a classpath configuration problem is assumed and the TreeWalker stops operating on the class completely. If set to true (the default), checkstyle assumes a typo or refactoring problem in the javadoc and logs the problem in the normal checkstyle report (potentially masking a configuration error). boolean true
suppressLoadErrors When logLoadErrors is set to true, the TreeWalker completely processes a class and displays any problems with loading exceptions as checkstyle violations. When this property is set to true, the violations generated when logLoadErrors is set true are suppressed from being reported as violations in the checkstyle report. boolean false

问题代码示例:

        public void test7() throws NullPointerException{
                
        }

提示信息:

Redundant Throws: Redundant throws: 'NullPointerException' is unchecked excpetion.

正确代码示例:

        public void test7(){
                
        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值