Skip to content

统一样式检查规范里,最为常用的统一样式工具是checkstyle插件,本文将介绍常用的统一风格的措施之静态样式检查 。@anarkh

统一样式检查

在标准化的统一样式检查规范里,最为常用的统一样式工具是checkstyle插件,而不是国内阿里的代码规约插件。

  • 下载插件

  • 配置生效

配置生效及告警设置

xml
<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
    "-//Puppy Crawl//DTD Check Configuration 1.3//EN"
    "http://www.puppycrawl.com/dtds/configuration_1_3.dtd">
    
<module name="Checker">

    <module name="TreeWalker">
    
    
        
          
        <module name="JavadocType">  
            <property name="authorFormat" value="\S"/>  
            <property name="scope" value="protected"/>  
            <property name="versionFormat" value="\$Revision.*\$"/>  
            <property name="excludeScope" value="public"/>  
            <property name="tokens" value="CLASS_DEF,INTERFACE_DEF"/>  
        </module>  
    
          
        <module name="JavadocMethod">    
            <property name="scope" value="private"/>    
            <property name="allowMissingParamTags" value="false"/>    
            <property name="allowMissingThrowsTags" value="false"/>    
            <property name="allowMissingReturnTag" value="false"/>    
            <property name="tokens" value="METHOD_DEF"/>    
            <property name="allowUndeclaredRTE" value="true"/>    
            <property name="allowThrowsTagsForSubclasses" value="true"/>    
              
            <property name="allowMissingPropertyJavadoc" value="true"/>  
        </module>   
        
          
        <module name="JavadocVariable">  
            <property name="scope" value="private"/>  
        </module>

        
        
          
        <module name="AbstractClassName">       
          <property name="format" value="^Abstract.*$|^.*Factory$"/> 
        </module>

          
        <module name="ConstantName">  
            <property name="format" value="^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$"/>  
        </module>  
        
          
        <module name="LocalFinalVariableName">  
            <property name="format" value="^[A_Z][A-Z0-9]*(_[A_Z0-9]+)*$"/>  
        </module>  
        
          
        <module name="LocalVariableName">  
            <property name="format" value="^[a-z][a-zA-Z0-9]*$"/>  
        </module>  
        
          
        <module name="MemberName">  
            <property name="format" value="^[a-z][a-zA-Z0-9]*$"/>  
            <property name="applyToPublic" value="true"/>  
            <property name="applyToProtected" value="true"/>  
            <property name="applyToPackage" value="true"/>  
            <property name="applyToPrivate" value="true"/>  
        </module>
        
         
        <module name="MethodName">  
            <property name="format" value="^[a-z][a-zA-Z0-9]*$"/>  
        </module>
        
         
        <module name="PackageName">  
            <property name="format" value="^[a-z]+(\.[a-z][a-z0-9]*)*$"/>  
        </module>  
        
         
        <module name="ParameterName">  
            <property name="format" value="^[a-z][a-zA-Z0-9]*$"/>  
        </module>
        
         
        <module name="StaticVariableName">  
            <property name="format" value="^[a-z][a-zA-Z0-9]*$"/>  
        </module>  
        
         
        <module name="TypeName">  
            <property name="format" value="^[A-Z][a-zA-Z0-9]*$"/>  
            <property name="tokens" value="CLASS_DEF,INTERFACE_DEF"/>  
        </module>
        
        
        
         
        <module name="AvoidStarImport">  
            <property name="excludes" value="java.io,java.util"/>  
        </module>
        
         
        <module name="IllegalImport"/>  
        
         
        <module name="ImportOrder">  
            <property name="groups" value="java,javax"/>  
            <property name="ordered" value="true"/>  
            <property name="separated" value="true"/>  
            <property name="caseSensitive" value="true"/>  
        </module>
        
         
        <module name="RedundantImport"/>
        
        
        <module name="UnusedImports"/> 
        
        
        
         
        <module name="AnonInnerLength">  
            <property name="max" value="20"/>  
        </module>  
        
         
        <module name="ExecutableStatementCount">  
            <property name="max" value="20"/>  
            <property name="tokens" value="CTOR_DEF,METHOD_DEF,STATIC_INIT,INSTANCE_INIT"/>  
        </module> 
        
         
        <module name="FileLength">  
            <property name="max" value="1000"/>  
        </module>
        
         
        <module name="LineLength">  
            <property name="max" value="80"/>  
            <property name="ignorePattern" value="^ *\* *[^ ]+$"/>  
        </module> 
        
         
        <module name="MethodLength">  
            <property name="max" value="100"/>  
            <property name="countEmpty" value="true"/>  
            <property name="tokens" value="METHOD_DEF"/>  
        </module> 
        
         
        <module name="ParameterNumber">  
            <property name="max" value="10"/>  
            <property name="tokens" value="METHOD_DEF,CTOR_DEF"/>  
        </module>
        
        
        
         
        <module name="EmptyForInitializerPad">  
            <property name="option" value="space"/>  
        </module>
        
         
        <module name="EmptyForIteratorPad">  
            <property name="option" value="space"/>  
        </module> 
        
         
        <module name="NoWhitespaceAfter"/>
        
         
        <module name="NoWhitespaceBefore"/>
        
         
        <module name="OperatorWrap">  
            <property name="tokens"   
                value="ASSIGN, DIV, DIV_ASSIGN, PLUS_ASSIGN, MINUS, MINUS_ASSIGN, STAR, STAR_ASSIGN, MOD, MOD_ASSIGN, SR, SR_ASSIGN, BSR, BSR_ASSIGN, SL, SL_ASSIGN, BXOR, BXOR_ASSIGN, BOR, BOR_ASSIGN, BAND, BAND_ASSIGN,PLUS, QUESTION"/>  
            <property name="option" value="eol"/>  
        </module> 
        
         
        <module name="MethodParamPad">  
            <property name="allowLineBreaks" value="false"/>  
            <property name="option" value="space"/>  
            <property name="tokens" value="METHOD_DEF,CTOR_DEF"/>  
        </module>
        
         
        <module name="ParenPad">  
            <property name="option" value="nospace"/>  
        </module>
        
         
        <module name="TypecastParenPad">  
            <property name="option" value="space"/>  
        </module> 
        
         
        <module name="TabCharacter"/>

         
        <module name="WhitespaceAfter">  
            <property name="tokens" value="COMMA,SEMI,TYPECAST"/>  
        </module>  
        
         
        <module name="WhitespaceAround">  
            <property name="tokens" value="ASSIGN"/>  
        </module> 
        
        
        
         
        <module name="ModifierOrder"/> 
        
        
        <module name="RedundantModifier">  
            <property name="tokens" value="METHOD_DEF,VARIABLE_DEF"/>  
        </module>
        
        
        
         
        <module name="AvoidNestedBlocks">  
            <property name="allowInSwitchCase" value="true"/>  
        </module>
        
        
        <module name="EmptyBlock">  
            <property name="option" value="stmt"/>  
        </module>
        
        
        <module name="LeftCurly">  
            <property name="option" value="eol"/>  
            <property name="maxLineLength" value="80"/>  
            <property name="tokens" value="CLASS_DEF,INTERFACE_DEF,METHOD_DEF,CTOR_DEF"/>  
        </module>
        
        
        <module name="NeedBraces"/>

        
        <module name="RightCurly">  
            <property name="option" value="alone"/>  
            <property name="tokens" value="LITERAL_TRY"/>  
        </module> 
        
        
        
         
        <module name="AvoidInlineConditionals"/>
        
        
        <module name="CovariantEquals"/> 
        
        
        <module name="DefaultComesLast"/>
        
        
        <module name="EmptyStatement"/>
        
        
        <module name="EqualsHashCode"/>
        
        
        <module name="ExplicitInitialization"/>
        
        
        <module name="FallThrough"/>
        
        
        <module name="FinalLocalVariable"/> 
        
        
         <module name="HiddenField"/>
         
        
        <module name="IllegalInstantiation"/>
        
        
        <module name="IllegalCatch"/>
        
        
        <module name="InnerAssignment"/>
        
        
        <module name="MagicNumber">
           <property name="ignoreNumbers" value="0, 1"/>
           <property name="ignoreAnnotation" value="true"/>
        </module>
        
        
        <module name="MissingSwitchDefault"/>
        
        
        <module name="ModifiedControlVariable"/>
        
        
        <module name="MultipleStringLiterals">  
            <property name="allowedDuplicates" value="3"/>  
        </module>
        
        
        <module name="MultipleVariableDeclarations"/>
        
        
        <module name="NestedIfDepth">  
            <property name="max" value="1"/>  
        </module>
        
        
        <module name="NestedTryDepth">  
            <property name="max" value="3"/>  
        </module>
        
        
        <module name="PackageDeclaration"/>
        
        
        <module name="ParameterAssignment"/>
        
        
        <module name="RedundantThrows">  
            <property name="allowUnchecked" value="true"/>  
            <property name="allowSubclasses" value="true"/>  
        </module>
        
        
        <module name="RequireThis">  
            <property name="checkFields" value="false"/>  
            <property name="checkMethods" value="false"/>  
        </module>
        
        
        <module name="Regexp">
            <property name="format" value="System\.out\.println"/>
            <property name="illegalPattern" value="true"/>
        </module>
        
        
        <module name="ReturnCount">  
            <property name="max" value="3"/>  
        </module>
        
        
        <module name="SimplifyBooleanExpression"/>
        
        
        <module name="SimplifyBooleanReturn"/> 
        
        
        <module name="StringLiteralEquality"/>
        
        
        <module name="SuperClone"/> 
        
        
        <module name="SuperFinalize"/>
        
        
        <module name="ArrayTrailingComma"/>
        
        
        <module name="UnnecessaryParentheses"/>
        
        
        
        
        <module name="DesignForExtension"/>
        
        
        <module name="FinalClass"/>
        
        
        <module name="HideUtilityClassConstructor"/>
        
        
        <module name="InterfaceIsType">  
            <property name="allowMarkerInterfaces" value="true"/>  
        </module>
        
        
         <module name="ThrowsCount">  
            <property name="max" value="7"/>  
        </module>
        
        
        <module name="VisibilityModifier">  
            <property name="packageAllowed" value="false"/>  
            <property name="protectedAllowed" value="false"/>  
            <property name="publicMemberPattern" value="^seriaVersionUID$"/>  
        </module>
        
        
        
        
        <module name="StrictDuplicateCode">  
            <property name="min" value="7"/>  
            <property name="charset" value="UTF-8"/>  
        </module> 
        
        
        
        <module name="BooleanExpressionComplexity">  
            <property name="max" value="7"/>  
        </module>
        
        
        <module name="ClassDataAbstractionCoupling">  
            <property name="max" value="7"/>  
        </module>
        
        
        <module name="CyclomaticComplexity">  
            <property name="severity" value="ignore"/>  
        </module>
        
        
        
        
        <module name="ArrayTypeStyle">  
            <property name="javaStyle" value="true"/>  
        </module>
        
        
        <module name="FinalParameters"/>
        
        
        <module name="Indentation">  
            <property name="basicOffset" value="4"/>  
            <property name="braceAdjustment" value="0"/>  
            <property name="caseIndent" value="4"/>  
        </module>
        
        
        <module name="NewlineAtEndOfFile"/>
        
        
        <module name="Translation">  
            <property name="severity" value="info"/>  
        </module>
        
        
        <module name="UncommentedMain">  
            <property name="excludedClasses" value="^$"/>  
        </module>
        
        
        <module name="UpperEll"/>
    </module>

</module>

首先在本地新建一个XML文件,将上面的代码保存到XML文件中,打开Settings->Tools->CheckStyle

  • 测试配置的CheckStyle