• JAVA静态代码审查之checkstyle


      技术总监来巡查,刚巧前段时间遇到了一个问题还没解决,就拉着大牛开问。结果,问题是解决了,还附带了另一个问题,或是要求出来,没啥技术含量,但是很麻烦的一个东西:代码格式。

      之前我写代码,因为屏幕比较小,所以就尽量一行写的不写两行,每一行都是一个逻辑片段,后期审阅时超级方便,但“这只是我自己的习惯而已”,可我觉着这么写,超级爽啊!但是,但是,但是,技术总监严厉要求,要按照公司自己的一套标准来写。

      后来我自己也想了下,我这么写的原因是,自己开发的笔记本的屏幕比较小,代码看不全所以才这么来的,可是,别人,特别是后期的运维人员在进行操作时,他们的机器情况跟我的完全不一样啊,万一他们的是90英寸超级大屏呢?想象一下,我的代码就漂浮在屏幕的最上边,想一条虫子,难看至极。

      哎,好吧,咱哥们还是按照公司的要求来吧,万一这个项目的接盘侠是个武力至上的人,那就等着被提刀满街追了。

      废话说了好多,就是心里不爽吐吐槽,现在,把一套checkstyle标准贴出来,以备后来装逼用。

      1 <?xml version="1.0" encoding="UTF-8"?>
      2 <!DOCTYPE module PUBLIC "-//Puppy Crawl//DTD Check Configuration 1.3//EN"
      3         "http://www.puppycrawl.com/dtds/configuration_1_3.dtd">
      4 
      5 <module name="Checker">
      6     <property name="severity" value="warning"/>
      7     <module name="TreeWalker">
      8         <module name="JavadocMethod">
      9             <property name="severity" value="ignore"/>
     10             <property name="suppressLoadErrors" value="true"/>
     11             <metadata name="net.sf.eclipsecs.core.lastEnabledSeverity" value="inherit"/>
     12         </module>
     13         <module name="JavadocType">
     14             <property name="severity" value="ignore"/>
     15             <metadata name="net.sf.eclipsecs.core.lastEnabledSeverity" value="inherit"/>
     16         </module>
     17         <module name="JavadocVariable">
     18             <property name="severity" value="ignore"/>
     19             <metadata name="net.sf.eclipsecs.core.lastEnabledSeverity" value="inherit"/>
     20         </module>
     21         <module name="ConstantName">
     22             <property name="applyToPrivate" value="false"/>
     23         </module>
     24         <module name="LocalFinalVariableName"/>
     25         <module name="LocalVariableName"/>
     26         <module name="MemberName"/>
     27         <module name="MethodName"/>
     28         <module name="PackageName"/>
     29         <module name="ParameterName"/>
     30         <module name="StaticVariableName"/>
     31         <module name="TypeName"/>
     32         <module name="AvoidStarImport"/>
     33         <module name="IllegalImport"/>
     34         <module name="RedundantImport"/>
     35         <module name="UnusedImports"/>
     36         <module name="MethodLength"/>
     37         <module name="ParameterNumber"/>
     38         <module name="LineLength">
     39             <property name="max" value="160"/>
     40             <property name="tabWidth" value="4"/>
     41         </module>
     42         <module name="EmptyForIteratorPad"/>
     43         <module name="MethodParamPad"/>
     44         <module name="NoWhitespaceAfter"/>
     45         <module name="NoWhitespaceBefore"/>
     46         <module name="OperatorWrap"/>
     47         <module name="ParenPad"/>
     48         <module name="TypecastParenPad"/>
     49         <module name="WhitespaceAfter"/>
     50         <module name="WhitespaceAround">
     51             <property name="tokens"
     52                       value="BAND,BAND_ASSIGN,BOR,BOR_ASSIGN,BSR,BSR_ASSIGN,BXOR,BXOR_ASSIGN,COLON,DIV,DIV_ASSIGN,EQUAL,GE,GT,LAND,LCURLY,LE,LITERAL_ASSERT,LITERAL_CATCH,LITERAL_DO,LITERAL_ELSE,LITERAL_FINALLY,LITERAL_FOR,LITERAL_IF,LITERAL_RETURN,LITERAL_SYNCHRONIZED,LITERAL_TRY,LITERAL_WHILE,LOR,LT,MINUS,MINUS_ASSIGN,MOD,MOD_ASSIGN,NOT_EQUAL,PLUS,PLUS_ASSIGN,QUESTION,RCURLY,SL,SLIST,SL_ASSIGN,SR,SR_ASSIGN,STAR,STAR_ASSIGN,LITERAL_ASSERT,TYPE_EXTENSION_AND,WILDCARD_TYPE"/>
     53         </module>
     54         <module name="ModifierOrder"/>
     55         <module name="RedundantModifier"/>
     56         <module name="AvoidNestedBlocks"/>
     57         <module name="EmptyBlock"/>
     58         <module name="LeftCurly"/>
     59         <module name="NeedBraces"/>
     60         <module name="RightCurly"/>
     61         <module name="AvoidInlineConditionals"/>
     62         <module name="EmptyStatement"/>
     63         <module name="EqualsHashCode"/>
     64         <module name="HiddenField">
     65             <property name="ignoreConstructorParameter" value="true"/>
     66             <property name="ignoreSetter" value="true"/>
     67         </module>
     68         <module name="IllegalInstantiation">
     69             <property name="classes" value="java.lang.Boolean"/>
     70         </module>
     71         <module name="InnerAssignment"/>
     72         <module name="MissingSwitchDefault"/>
     73         <module name="RedundantThrows">
     74             <property name="severity" value="ignore"/>
     75             <property name="suppressLoadErrors" value="true"/>
     76             <metadata name="net.sf.eclipsecs.core.lastEnabledSeverity" value="inherit"/>
     77         </module>
     78         <module name="SimplifyBooleanExpression"/>
     79         <module name="SimplifyBooleanReturn"/>
     80         <module name="FinalClass"/>
     81         <module name="HideUtilityClassConstructor"/>
     82         <module name="InterfaceIsType"/>
     83         <module name="VisibilityModifier"/>
     84         <module name="ArrayTypeStyle"/>
     85         <module name="TodoComment"/>
     86         <module name="UpperEll"/>
     87         <module name="OperatorWrap"/>
     88     </module>
     89     <module name="JavadocPackage">
     90         <property name="severity" value="ignore"/>
     91         <metadata name="net.sf.eclipsecs.core.lastEnabledSeverity" value="inherit"/>
     92     </module>
     93     <module name="NewlineAtEndOfFile"/>
     94     <module name="Translation"/>
     95     <module name="FileLength"/>
     96     <module name="FileTabCharacter">
     97         <property name="severity" value="ignore"/>
     98         <metadata name="net.sf.eclipsecs.core.lastEnabledSeverity" value="inherit"/>
     99     </module>
    100     <module name="RegexpSingleline">
    101         <property name="format" value="s+$"/>
    102         <property name="message" value="Line has trailing spaces."/>
    103     </module>
    104 </module>

      具体的代码含义懒得分析了,直接拿来用就ok了。

    附上用法:

      Eclipse 或者 IntelliJ IDEA 等 IDE 中有对应的 Plugin。可搜索相应的 Plugin Market 安装。

      以 IntelliJ IDEA 为例。

      菜单选择 File>Setting,Plugins 选项卡中搜索 checkstyle 与 findbugs 进行安装。安装可能需要翻墙,可也去IDEA官网的插件页面里去下载,然后手动添加到IDEA中去。

      菜单选择 File>Setting, Other Settings 中,会有安装后的Plugin的选项。

      CheckStyle 选项中新增 Configuration File, 选择 "Use a local CheckStyle file", File: 中选择本项目中的 checkstyle.xml 文件,Description 随意命名,比如 "Vastio Java Style"。

      将新增加的 Configuration File 设为 Active。

      最后,确认一下 Setting 中的 Editor:Inspections:CheckStyle 中的 Real-time scan 是打开的。

    PS : 阿里巴巴要搞事情了额,他们出了个JAVA开发规范手册,里面一大堆的规定,so,为了懒得查阅书籍,写个checkstyle来自动检测代码吧:

      1 <?xml version="1.0" encoding="UTF-8"?>
      2 <!DOCTYPE module PUBLIC "-//Puppy Crawl//DTD Check Configuration 1.3//EN"
      3         "http://www.puppycrawl.com/dtds/configuration_1_3.dtd">
      4 
      5 <module name="Checker">
      6 
      7     <!-- 检查文件是否以一个空行结束 -->
      8     <module name="NewlineAtEndOfFile"/>
      9 
     10     <!-- 文件长度不超过1500行 -->
     11     <module name="FileLength">
     12         <property name="max" value="1500"/>
     13     </module>
     14 
     15     <!-- 每个java文件一个语法树 -->
     16     <module name="TreeWalker">
     17         <!-- import检查-->
     18         <!-- 检查是否从非法的包中导入了类 -->
     19         <module name="IllegalImport"/>
     20         <!-- 检查是否导入了多余的包 -->
     21         <module name="RedundantImport"/>
     22         <!-- 没用的import检查,比如:1.没有被用到2.重复的3.import java.lang的4.import 与该类在同一个package的 -->
     23         <module name="UnusedImports"/>
     24 
     25         <!-- 注释检查 -->
     26         <!-- 检查构造函数的javadoc -->
     27         <module name="JavadocType">
     28             <property name="allowUnknownTags" value="true"/>
     29             <message key="javadoc.missing" value="类注释:缺少Javadoc注释。"/>
     30         </module>
     31 
     32         <!-- 命名检查 -->
     33         <!-- 局部的final变量,包括catch中的参数的检查 -->
     34         <module name="LocalFinalVariableName"/>
     35         <!-- 局部的非final型的变量,包括catch中的参数的检查 -->
     36         <module name="LocalVariableName"/>
     37         <!-- 包名的检查(只允许小写字母),默认^[a-z]+(.[a-zA-Z_][a-zA-Z_0-9_]*)*$ -->
     38         <module name="PackageName">
     39             <property name="format" value="^[a-z]+(.[a-z][a-z0-9]*)*$"/>
     40             <message key="name.invalidPattern" value="包名 ''{0}'' 要符合 ''{1}''格式."/>
     41         </module>
     42         <!-- 仅仅是static型的变量(不包括static final型)的检查 -->
     43         <module name="StaticVariableName"/>
     44         <!-- Class或Interface名检查,默认^[A-Z][a-zA-Z0-9]*$-->
     45         <module name="TypeName">
     46             <property name="severity" value="warning"/>
     47             <message key="name.invalidPattern" value="名称 ''{0}'' 要符合 ''{1}''格式."/>
     48         </module>
     49         <!-- 非static型变量的检查 -->
     50         <module name="MemberName"/>
     51         <!-- 方法名的检查 -->
     52         <module name="MethodName"/>
     53         <!-- 方法的参数名 -->
     54         <module name="ParameterName "/>
     55         <!-- 常量名的检查(只允许大写),默认^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$ -->
     56         <module name="ConstantName"/>
     57 
     58         <!-- 定义检查 -->
     59         <!-- 检查数组类型定义的样式 -->
     60         <module name="ArrayTypeStyle"/>
     61         <!-- 检查long型定义是否有大写的“L” -->
     62         <module name="UpperEll"/>
     63 
     64         <!-- 长度检查 -->
     65         <!-- 每行不超过140个字符 -->
     66         <module name="LineLength">
     67             <property name="max" value="140"/>
     68         </module>
     69         <!-- 方法不超过50行 -->
     70         <module name="MethodLength">
     71             <property name="tokens" value="METHOD_DEF"/>
     72             <property name="max" value="50"/>
     73         </module>
     74         <!-- 方法的参数个数不超过5个。 并且不对构造方法进行检查-->
     75         <module name="ParameterNumber">
     76             <property name="max" value="5"/>
     77             <property name="ignoreOverriddenMethods" value="true"/>
     78             <property name="tokens" value="METHOD_DEF"/>
     79         </module>
     80 
     81         <!-- 空格检查-->
     82         <!-- 方法名后跟左圆括号"(" -->
     83         <module name="MethodParamPad"/>
     84         <!-- 在类型转换时,不允许左圆括号右边有空格,也不允许与右圆括号左边有空格 -->
     85         <module name="TypecastParenPad"/>
     86         <!-- 检查在某个特定关键字之后应保留空格 -->
     87         <module name="NoWhitespaceAfter"/>
     88         <!-- 检查在某个特定关键字之前应保留空格 -->
     89         <module name="NoWhitespaceBefore"/>
     90         <!-- 操作符换行策略检查 -->
     91         <module name="OperatorWrap"/>
     92         <!-- 圆括号空白 -->
     93         <module name="ParenPad"/>
     94         <!-- 检查分隔符是否在空白之后 -->
     95         <module name="WhitespaceAfter"/>
     96         <!-- 检查分隔符周围是否有空白 -->
     97         <module name="WhitespaceAround"/>
     98 
     99         <!-- 修饰符检查 -->
    100         <!-- 检查修饰符的顺序是否遵照java语言规范,默认public、protected、private、abstract、static、final、transient、volatile、synchronized、native、strictfp -->
    101         <module name="ModifierOrder"/>
    102         <!-- 检查接口和annotation中是否有多余修饰符,如接口方法不必使用public -->
    103         <module name="RedundantModifier"/>
    104 
    105         <!-- 代码块检查 -->
    106         <!-- 检查是否有嵌套代码块 -->
    107         <module name="AvoidNestedBlocks"/>
    108         <!-- 检查是否有空代码块 -->
    109         <module name="EmptyBlock"/>
    110         <!-- 检查左大括号位置 -->
    111         <module name="LeftCurly"/>
    112         <!-- 检查代码块是否缺失{} -->
    113         <module name="NeedBraces"/>
    114         <!-- 检查右大括号位置 -->
    115         <module name="RightCurly"/>
    116 
    117         <!-- 代码检查 -->
    118         <!-- 检查空的代码段 -->
    119         <module name="EmptyStatement"/>
    120         <!-- 检查在重写了equals方法后是否重写了hashCode方法 -->
    121         <module name="EqualsHashCode"/>
    122         <!-- 检查局部变量或参数是否隐藏了类中的变量 -->
    123         <module name="HiddenField">
    124             <property name="tokens" value="VARIABLE_DEF"/>
    125         </module>
    126         <!-- 检查子表达式中是否有赋值操作 -->
    127         <module name="InnerAssignment"/>
    128         <!-- 检查switch语句是否有default -->
    129         <module name="MissingSwitchDefault"/>
    130         <!-- 检查是否有过度复杂的布尔表达式 -->
    131         <module name="SimplifyBooleanExpression"/>
    132         <!-- 检查是否有过于复杂的布尔返回代码段 -->
    133         <module name="SimplifyBooleanReturn"/>
    134 
    135         <!-- 类设计检查 -->
    136         <!-- 检查类是否为扩展设计l -->
    137         <!-- 检查只有private构造函数的类是否声明为final -->
    138         <module name="FinalClass"/>
    139         <!-- 检查接口是否仅定义类型 -->
    140         <module name="InterfaceIsType"/>
    141         <!-- 检查类成员的可见度 检查类成员的可见性。只有static final 成员是public的
    142         除非在本检查的protectedAllowed和packagedAllowed属性中进行了设置-->
    143         <module name="VisibilityModifier">
    144             <property name="packageAllowed" value="true"/>
    145             <property name="protectedAllowed" value="true"/>
    146         </module>
    147 
    148         <!-- 语法 -->
    149         <!-- String的比较不能用!= 和 == -->
    150         <module name="StringLiteralEquality"/>
    151         <!-- 限制for循环最多嵌套2层 -->
    152         <module name="NestedForDepth">
    153             <property name="max" value="2"/>
    154         </module>
    155         <!-- if最多嵌套3层 -->
    156         <module name="NestedIfDepth">
    157             <property name="max" value="3"/>
    158         </module>
    159         <!-- 检查未被注释的main方法,排除以Appllication结尾命名的类 -->
    160         <module name="UncommentedMain">
    161             <property name="excludedClasses" value=".*[Application,Test]$"/>
    162         </module>
    163         <!-- 禁止使用System.out.println -->
    164         <module name="Regexp">
    165             <property name="format" value="System.out.println"/>
    166             <property name="illegalPattern" value="true"/>
    167         </module>
    168         <!-- return个数 3个-->
    169         <module name="ReturnCount">
    170             <property name="max" value="3"/>
    171         </module>
    172         <!--try catch 异常处理数量 3-->
    173         <module name="NestedTryDepth ">
    174             <property name="max" value="3"/>
    175         </module>
    176         <!-- clone方法必须调用了super.clone() -->
    177         <module name="SuperClone"/>
    178         <!-- finalize 必须调用了super.finalize() -->
    179         <module name="SuperFinalize"/>
    180 
    181     </module>
    182 </module>

      使用方法跟上一个checks一样,丢到IDEA里面就行了,懒省事。

    PPS:阿里大法好,但我觉着谷歌大法更好:

      1 <?xml version="1.0"?>
      2 <!DOCTYPE module PUBLIC
      3     "-//Puppy Crawl//DTD Check Configuration 1.3//EN"
      4     "http://www.puppycrawl.com/dtds/configuration_1_3.dtd">
      5 
      6 <!--
      7     Checkstyle configuration that checks the Google coding conventions from Google Java Style
      8     that can be found at https://google.github.io/styleguide/javaguide.html.
      9     Checkstyle is very configurable. Be sure to read the documentation at
     10     http://checkstyle.sf.net (or in your downloaded distribution).
     11     To completely disable a check, just comment it out or delete it from the file.
     12     Authors: Max Vetrenko, Ruslan Diachenko, Roman Ivanov.
     13  -->
     14 
     15 <module name="Checker">
     16     <property name="charset" value="UTF-8"/>
     17 
     18     <property name="severity" value="warning"/>
     19 
     20     <!--<property name="fileExtensions" value="java, properties, xml"/>-->
     21     <!-- Checks for whitespace                               -->
     22     <!-- See http://checkstyle.sf.net/config_whitespace.html -->
     23     <module name="FileTabCharacter">
     24         <property name="eachLine" value="true"/>
     25     </module>
     26 
     27     <module name="TreeWalker">
     28         <module name="OuterTypeFilename"/>
     29         <module name="IllegalTokenText">
     30             <property name="tokens" value="STRING_LITERAL, CHAR_LITERAL"/>
     31             <property name="format"
     32                       value="\u00(08|09|0(a|A)|0(c|C)|0(d|D)|22|27|5(C|c))|\(0(10|11|12|14|15|42|47)|134)"/>
     33             <property name="message" value="Avoid using corresponding octal or Unicode escape."/>
     34         </module>
     35         <module name="AvoidEscapedUnicodeCharacters">
     36             <property name="allowEscapesForControlCharacters" value="true"/>
     37             <property name="allowByTailComment" value="true"/>
     38             <property name="allowNonPrintableEscapes" value="true"/>
     39         </module>
     40         <!--单行最大长度,google100,修改-->
     41         <module name="LineLength">
     42             <property name="max" value="200"/>
     43             <property name="ignorePattern"
     44                       value="^package.*|^import.*|a href|href|http://|https://|ftp://"/>
     45         </module>
     46         <module name="AvoidStarImport"/><!--import要指明到类 不能包含*-->
     47         <module name="OneTopLevelClass"/>
     48         <module name="NoLineWrap"/>
     49         <module name="EmptyBlock">
     50             <property name="option" value="TEXT"/>
     51             <property name="tokens"
     52                       value="LITERAL_TRY, LITERAL_FINALLY, LITERAL_IF, LITERAL_ELSE, LITERAL_SWITCH,LITERAL_WHILE,LITERAL_FOR,LITERAL_CASE"/>
     53         </module>
     54         <module name="NeedBraces"/>
     55         <!--option: 定义左大括号'{'显示位置,eol在同一行显示,nl在下一行显示
     56          maxLineLength: 大括号'{'所在行行最多容纳的字符数
     57          tokens: 该属性适用的类型,例:CLASS_DEF,INTERFACE_DEF,METHOD_DEF,CTOR_DEF -->
     58         <module name="LeftCurly">
     59             <property name="maxLineLength" value="100"/>
     60         </module>
     61 
     62         <module name="RightCurly"/>
     63         <module name="RightCurly">
     64             <property name="option" value="alone"/>
     65             <property name="tokens"
     66                       value="CLASS_DEF, METHOD_DEF, CTOR_DEF, LITERAL_FOR, LITERAL_WHILE, LITERAL_DO, STATIC_INIT, INSTANCE_INIT"/>
     67         </module>
     68         <!--检查空格 方法体前括号,比较操作符两边空格等-->
     69         <module name="WhitespaceAround">
     70             <property name="allowEmptyConstructors" value="true"/>
     71             <property name="allowEmptyMethods" value="true"/>
     72             <property name="allowEmptyTypes" value="true"/>
     73             <property name="allowEmptyLoops" value="true"/>
     74             <message key="ws.notFollowed"
     75                      value="WhitespaceAround: ''{0}'' is not followed by whitespace. Empty blocks may only be represented as '{}' when not part of a multi-block statement (4.1.3)"/>
     76             <message key="ws.notPreceded"
     77                      value="WhitespaceAround: ''{0}'' is not preceded with whitespace."/>
     78         </module>
     79         <module name="OneStatementPerLine"/>
     80         <!--一行声明一个变量-->
     81         <module name="MultipleVariableDeclarations"/>
     82         <module name="ArrayTypeStyle"/>
     83         <!--default clause-->
     84         <module name="MissingSwitchDefault"/>
     85         <!--case break-->
     86         <module name="FallThrough"/>
     87         <!--Long型常量后缀-->
     88         <module name="UpperEll"/>
     89         <module name="ModifierOrder"/>
     90         <!--空行规则-->
     91         <module name="EmptyLineSeparator">
     92             <property name="allowNoEmptyLineBetweenFields" value="true"/>
     93         </module>
     94         <module name="SeparatorWrap">
     95             <property name="tokens" value="DOT"/>
     96             <property name="option" value="nl"/>
     97         </module>
     98         <module name="SeparatorWrap">
     99             <property name="tokens" value="COMMA"/>
    100             <property name="option" value="EOL"/>
    101         </module>
    102         <module name="PackageName">
    103             <property name="format" value="^[a-z]+(.[a-z][a-z0-9]*)*$"/>
    104             <message key="name.invalidPattern"
    105                      value="Package name ''{0}'' must match pattern ''{1}''."/>
    106         </module>
    107         <module name="TypeName">
    108             <message key="name.invalidPattern"
    109                      value="Type name ''{0}'' must match pattern ''{1}''."/>
    110         </module>
    111         <!--成员变量命名规则--><!--修改-->
    112         <module name="MemberName">
    113             <property name="format" value="^m[A-Z][a-zA-Z0-9]*$"/>
    114             <message key="name.invalidPattern"
    115                      value="Member name ''{0}'' must match pattern ''{1}''."/>
    116         </module>
    117         <!--参数命名规则--><!--修改-->
    118         <module name="ParameterName">
    119             <property name="format" value="^[a-z][a-zA-Z0-9]*$"/>
    120             <message key="name.invalidPattern"
    121                      value="Parameter name ''{0}'' must match pattern ''{1}''."/>
    122         </module>
    123         <!--unused start-->
    124         <!--<module name="CatchParameterName">-->
    125         <!--<property name="format" value="^[a-z][a-z0-9][a-zA-Z0-9]*$"/>-->
    126         <!--<message key="name.invalidPattern"-->
    127         <!--value="Catch parameter name ''{0}'' must match pattern ''{1}''."/>-->
    128         <!--</module>-->
    129         <!--unused end-->
    130         <module name="LocalVariableName">
    131             <property name="tokens" value="VARIABLE_DEF"/>
    132             <property name="format" value="^[a-z][a-zA-Z0-9]*$"/>
    133             <property name="allowOneCharVarInForLoop" value="true"/>
    134             <message key="name.invalidPattern"
    135                      value="Local variable name ''{0}'' must match pattern ''{1}''."/>
    136         </module>
    137         <module name="ClassTypeParameterName">
    138             <property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)"/>
    139             <message key="name.invalidPattern"
    140                      value="Class type name ''{0}'' must match pattern ''{1}''."/>
    141         </module>
    142         <module name="MethodTypeParameterName">
    143             <property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)"/>
    144             <message key="name.invalidPattern"
    145                      value="Method type name ''{0}'' must match pattern ''{1}''."/>
    146         </module>
    147         <module name="InterfaceTypeParameterName">
    148             <property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)"/>
    149             <message key="name.invalidPattern"
    150                      value="Interface type name ''{0}'' must match pattern ''{1}''."/>
    151         </module>
    152         <!--不能定义finalize方法-->
    153         <module name="NoFinalizer"/>
    154         <!--泛型表示中的空格规则-->
    155         <module name="GenericWhitespace">
    156             <message key="ws.followed"
    157                      value="GenericWhitespace ''{0}'' is followed by whitespace."/>
    158             <message key="ws.preceded"
    159                      value="GenericWhitespace ''{0}'' is preceded with whitespace."/>
    160             <message key="ws.illegalFollow"
    161                      value="GenericWhitespace ''{0}'' should followed by whitespace."/>
    162             <message key="ws.notPreceded"
    163                      value="GenericWhitespace ''{0}'' is not preceded with whitespace."/>
    164         </module>
    165         <!--缩进规则-->
    166         <module name="Indentation">
    167             <property name="basicOffset" value="4"/>
    168             <property name="braceAdjustment" value="0"/>
    169             <property name="caseIndent" value="4"/>
    170             <property name="throwsIndent" value="4"/>
    171             <property name="arrayInitIndent" value="4"/>
    172             <property name="lineWrappingIndentation" value="4"/>
    173         </module>
    174         <!--名称中缩写,驼峰规则-->
    175         <module name="AbbreviationAsWordInName">
    176             <property name="ignoreFinal" value="false"/>
    177             <property name="allowedAbbreviationLength" value="1"/>
    178         </module>
    179         <!--重载方法不能被其他方法间隔开-->
    180         <module name="OverloadMethodsDeclarationOrder"/>
    181         <!--局部变量声明与使用的间隔,默认3行-->
    182         <module name="VariableDeclarationUsageDistance"/>
    183         <!--import规则与android studio IDE 不一致,采用IDE规则-->
    184         <!--<module name="CustomImportOrder">-->
    185             <!--<property name="specialImportsRegExp" value="com.google"/>-->
    186             <!--<property name="sortImportsInGroupAlphabetically" value="true"/>-->
    187             <!--<property name="customImportOrderRules"-->
    188                       <!--value="STATIC###SPECIAL_IMPORTS###THIRD_PARTY_PACKAGE###STANDARD_JAVA_PACKAGE"/>-->
    189         <!--</module>-->
    190         <module name="MethodParamPad"/>
    191         <module name="OperatorWrap">
    192             <property name="option" value="NL"/>
    193             <property name="tokens"
    194                       value="BAND, BOR, BSR, BXOR, DIV, EQUAL, GE, GT, LAND, LE, LITERAL_INSTANCEOF, LOR, LT, MINUS, MOD, NOT_EQUAL, PLUS, QUESTION, SL, SR, STAR "/>
    195         </module>
    196         <module name="AnnotationLocation">
    197             <property name="tokens"
    198                       value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, METHOD_DEF, CTOR_DEF"/>
    199         </module>
    200         <module name="AnnotationLocation">
    201             <property name="tokens" value="VARIABLE_DEF"/>
    202             <property name="allowSamelineMultipleAnnotations" value="true"/>
    203         </module>
    204         <!--@注释 @param, @return, @throws, @deprecated -->
    205         <module name="NonEmptyAtclauseDescription"/>
    206         <module name="JavadocTagContinuationIndentation"/>
    207         <!--unused start-->
    208         <!--注释文档规则,@return 不能包含的文字,第一句注释结尾标点-->
    209         <!--<module name="SummaryJavadoc">-->
    210             <!--<property name="forbiddenSummaryFragments"-->
    211                       <!--value="^@return the *|^This method returns |^A [{]@code [a-zA-Z0-9]+[}]( is a )"/>-->
    212         <!--</module>-->
    213         <!--unused end-->
    214         <module name="JavadocParagraph"/>
    215         <module name="AtclauseOrder">
    216             <property name="tagOrder" value="@param, @return, @throws, @deprecated"/>
    217             <property name="target"
    218                       value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, METHOD_DEF, CTOR_DEF, VARIABLE_DEF"/>
    219         </module>
    220         <!--方法注释 修改 可以不添加方法注释-->
    221         <module name="JavadocMethod">
    222             <property name="scope" value="public"/>
    223             <property name="allowMissingParamTags" value="true"/>
    224             <property name="allowMissingThrowsTags" value="true"/>
    225             <property name="allowMissingReturnTag" value="true"/>
    226             <property name="minLineCount" value="2"/>
    227             <property name="allowedAnnotations" value="Override, Test"/>
    228             <property name="allowThrowsTagsForSubclasses" value="true"/>
    229             <property name="allowMissingJavadoc"  value="true"  />
    230         </module>
    231         <module name="MethodName">
    232             <property name="format" value="^[a-z][a-z0-9][a-zA-Z0-9_]*$"/>
    233             <message key="name.invalidPattern"
    234                      value="Method name ''{0}'' must match pattern ''{1}''."/>
    235         </module>
    236         <!--these unused start-->
    237         <!--<module name="SingleLineJavadoc">-->
    238         <!--<property name="ignoreInlineTags" value="false"/>-->
    239         <!--</module>-->
    240         <!--<module name="EmptyCatchBlock">-->
    241         <!--<property name="exceptionVariableName" value="expected"/>-->
    242         <!--</module>-->
    243         <!--<module name="CommentsIndentation"/>-->
    244         <!--these unused end-->
    245         <!--嵌套深度-->
    246         <module name="NestedForDepth"/>
    247         <module name="NestedTryDepth"/>
    248         <module name="NestedIfDepth">
    249             <property name="max" value="3"/>
    250         </module>
    251         <!--<module name="MethodLength">-->
    252             <!--<property name="max" value="20"/>-->
    253             <!--<property name="countEmpty"  value="false"/>-->
    254         <!--</module>-->
    255         <module name="SimplifyBooleanExpression"/>
    256         <module name="StaticVariableName" >
    257             <property name="format" value="^s[A-Z][a-zA-Z0-9]*$"/>
    258         </module>
    259         <!--<module name="TodoComment"/>-->
    260     </module>
    261 </module>
  • 相关阅读:
    安装MySQL ODBC应注意的问题
    AJAX跨域资源共享 CORS 详解
    RealThinClient SDK 学习笔记(1)
    mysql中两表更新时产生的奇葩问题,产生死锁!
    MySQL使用FEDERATED engine建立代理表
    Java Collection与ConcurrentModificationException
    Maven 命令
    多线程12-ManualResetEventSlim
    多线程11-AutoResetEvent
    多线程10-SemaphoreSlim
  • 原文地址:https://www.cnblogs.com/SummerinShire/p/6237440.html
Copyright © 2020-2023  润新知