自定义checkstyle

定制检查:Checkstyle没有图形化的定制器,所以需要手工修改配置文件。比如,我们的代码需要符合下列规则:
*

长度方面:文件长度不超过1500行,每行不超过120个字,方法不超过60行.
*

命名方面:类名不能小写开头,方法名不能大写开头,常量不能有小写字母。
*

编码方面:不能用魔法数(Magic Number),if最多嵌套3层。

那么,我们的检查配置文件(如命名成 my_check.xml )应该是这样的:

下面是对具体的check的描述。这些check可以被分为了15类,如下所示:

===== CHECK STYLE ========

----- Annotations -------- JDK5中的Annotation相关(未展开)

----- Block Checks ------- 代码块相关

----- Class Design ------- 类设计相关

----- Coding ------------- 编码相关

----- Duplicate Code ----- 冗余代码

----- Headers ------------ 源文件的头

----- Imports ------------ 引入包相关

----- Javadoc Comments --- JavaDoc相关

----- Metrics ------------ 复杂度分析

----- Miscellaneous ------ 其它

----- Modifiers ---------- 修饰符相关

----- Naming Conventions - 命名规范

----- Regexp ------------- 正则表达式相关

----- Size Violations ---- 文件大小等相关

----- Whitespace --------- 空格处理相关

==========================

 

 


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE module PUBLIC
"-//Puppy Crawl//DTD Check Configuration 1.2//EN"
"http://www.puppycrawl.com/dtds/configuration_1_2.dtd">
<module name="Checker">
<module name="TreeWalker">

<!-- 长度方面的检查 -->
<!-- 文件长度不超过1500行 -->
<module name="FileLength">
<property name="max" value="1500"/>
</module>
<!-- 每行不超过120个字-->
<module name="LineLength">
<property name="max" value="120"/>
</module>
<!-- 方法不超过60行 -->
<module name="MethodLength">
<property name="tokens" value="METHOD_DEF"/>
<property name="max" value="60"/>
</module>

<!-- 命名方面的检查,它们都使用了Checkstyle默认的规则。 -->
<!-- 类名(class 或interface) 的检查 -->
<module name="TypeName"/>
<!-- 方法名的检查 -->
<module name="MethodName"/>
<!-- 常量名的检查 -->
<module name="ConstantName"/>

<!-- 编码方面的检查 -->
<!-- 不能用魔法数 -->
<module name="MagicNumber"/>
<!-- if最多嵌套3层 -->
<module name="NestedIfDepth">
<property name="max" value="3"/>
</module>

</module>
</module>


可以看出,想增加一个检查,就是增加一个<module/>结点。具体的结点内容在后面的文档都会写明。dds  

 

 

1. <!DOCTYPE module PUBLIC 

  2.     "-//Puppy Crawl//DTDCheck 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.     <modulename="StrictDuplicateCode"> 

 11.         <propertyname="min" value="8" /> 

 12.         <propertyname="charset" value="UTF-8" /> 

 13.     </module> 

 14.  

 15.     <modulename="TreeWalker"> 

  16.  

 17.         <!-- javadoc的检查--> 

 18.         <!-- 检查所有的interface和class--> 

 19.         <modulename="JavadocType" /> 

 20.  

 21.         <!-- 命名方面的检查,它们都使用了Sun官方定的规则。 --> 

 22.         <!-- 局部的final变量,包括catch中的参数的检查--> 

 23.         <modulename="LocalFinalVariableName" /> 

 24.         <!-- 局部的非final型的变量,包括catch中的参数的检查--> 

 25.         <modulename="LocalVariableName" /> 

 26.         <!-- 包名的检查(只允许小写字母) --> 

 27.         <modulename="PackageName"> 

 28.             <propertyname="format" value="^[a-z]+(\.[a-z][a-z0-9]*)*$"/> 

 29.         </module> 

 30.         <!-- 仅仅是static型的变量(不包括staticfinal型)的检查 --> 

 31.         <modulename="StaticVariableName" /> 

 32.         <!-- 类型(Class或Interface)名的检查--> 

  33.         <module name="TypeName"/> 

 34.         <!-- 非static型变量的检查--> 

 35.         <modulename="MemberName" /> 

 36.         <!-- 方法名的检查--> 

 37.         <modulename="MethodName" /> 

 38.         <!-- 方法的参数名--> 

 39.         <module name="ParameterName" /> 

 40.         <!-- 常量名的检查--> 

 41.         <modulename="ConstantName" /> 

 42.  

 43.         <!-- import方面的检查--> 

 44.         <!-- import中避免星号"*"--> 

 45.         <modulename="AvoidStarImport" /> 

 46.         <!-- 

 47.             没用的import检查,比如:1.没有被用到2.重复的3.importjava.lang的4.import 

 48.             与该类在同一个package的 

 49.         --> 

 50.         <modulename="UnusedImports" /> 

 51.  

 52.  

 53.         <!-- 长度方面的检查--> 

 54.         <!-- 文件长度不超过1500行 --> 

 55.         <modulename="FileLength"> 

 56.             <propertyname="max" value="1500" /> 

 57.         </module> 

 58.         <!-- 每行不超过120个字--> 

 59.         <modulename="LineLength"> 

 60.             <propertyname="max" value="120" /> 

 61.         </module> 

 62.         <!-- 方法不超过30行 --> 

 63.         <modulename="MethodLength"> 

 64.             <propertyname="tokens" value="METHOD_DEF" /> 

 65.             <propertyname="max" value="30" /> 

 66.         </module> 

 67.         <!-- 方法的参数个数不超过3个。 并且不对构造方法进行检查--> 

 68.         <modulename="ParameterNumber"> 

 69.             <propertyname="max" value="3" /> 

 70.             <propertyname="tokens" value="METHOD_DEF" /> 

  71.         </module> 

 72.  

 73.         <!-- 空格检查  --> 

 74.         <!-- 允许方法名后紧跟左边圆括号"("--> 

 75.         <modulename="MethodParamPad" /> 

 76.         <!-- 在类型转换时,不允许左圆括号右边有空格,也不允许与右圆括号左边有空格 --> 

 77.         <modulename="TypecastParenPad" /> 

 78.         <!-- 不允许使用"tab"键  --> 

 79.         <modulename="TabCharacter" /> 

 80.  

 81.         <!-- 关键字--> 

 82.         <!-- 

 83.             每个关键字都有正确的出现顺序。比如 public static final XXX 是对一个常量的声明。如果使用static 

 84.             public final 就是错误的 

 85.         --> 

 86.         <modulename="ModifierOrder" /> 

 87.         <!-- 多余的关键字--> 

 88.         <modulename="RedundantModifier" /> 

 89.  

 90.         <!-- 对区域的检查--> 

 91.         <!-- 不能出现空白区域--> 

 92.         <modulename="EmptyBlock" /> 

 93.         <!-- 所有区域都要使用大括号。--> 

 94.         <modulename="NeedBraces" /> 

 95.         <!-- 多余的括号--> 

 96.         <modulename="AvoidNestedBlocks"> 

 97.             <propertyname="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.             <propertyname="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.        <!-- 一个方法中最多有3个return --> 

 142.        <module name="ReturnCount"> 

 143.             <property name="max"value="3" /> 

 144.             <propertyname="format" value="^$" /> 

 145.        </module> 

 146.        <!-- 

 147.             根据 Sun 编码规范, class 或 interface 中的顺序如下:1.class 声明。首先是 public, 

 148.            然后是protected , 然后是 packagelevel (不包括access modifier )最后是private . 

 149.             (多个class放在一个java文件中的情况) 2.变量声明。 首先是 public, 然后是protected然后是package 

 150.             level (不包括accessmodifier )最后是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.             <propertyname="format" value="System\.out\.println" /> 

 181.             <propertyname="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> 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值