还在为代码的规范问题头疼吗?CheckStyle来了解一下

程序员考拉

共 3534字,需浏览 8分钟

 ·

2020-12-07 12:23

公众号关注 “GitHub今日热榜
设为 “星标”,带你挖掘更多开发神器!





CheckStyle 是 SourceForge 下的一个项目,提供了一个帮助 Java 开发人员遵守某些编码规范的工具。开发人员能够根据已经设置好的编码规则来自动地检查自己所写的代码,例如:方法的命名、方法的函数、变量的命名等是否符合规范。也就是说,只要设置好了规则,CheckStyle 就可以根据规则自动地检查代码中不符合要求的地方,听上去就是一个很解放人力的工具,接下来具体地了解一下这个工具吧!


CheckStyle 除了上面说的检查方法、变量的命名以及方法的函数之外,还有很多可以检验的内容,例如:Javadoc 注释,命名约定,标题,import 语句,空白,修饰符,代码块以及类设计等。既然功能这么齐全,如何使用呢?


一、下载和安装


CheckStyle 的下载可以去官网。官网链接:http://checkstyle.sourceforge.net/。


接下来的安装教程是基于 Eclipse 的。


1、打开eclipse, help->Install New Software...    然后填入:CheckStyle - http://eclipse-cs.sourceforge.NET/update



2、选中上图的两个文件,依次点击 Next -->Next,选中I accept .....,Finish。




3、点击 Install anyway 。



4、点击重启,生效。



二、导入 CheckStyle 规范


CheckStyle 的规范一个 xml 文件,格式可以从网上下载,然后根据自己的需要进行修改。例如:


<module name="Checker">
    
    <property name="charset" value="UTF-8" />
    
    <property name="severity" value="warning" />
    
    <property name="fileExtensions" value="java, properties, xml" />
    
    <module name="FileTabCharacter">
        <property name="eachLine" value="true" />
    module>
 
    
    <module name="TreeWalker">
        
        <module name="OuterTypeFilename" />
        
        <module name="IllegalTokenText">
            <property name="tokens" value="STRING_LITERAL, CHAR_LITERAL" />
            <property name="format"
                value="\\u00(09|0(a|A)|0(c|C)|0(d|D)|22|27|5(C|c))|\\(0(10|11|12|14|15|42|47)|134)" />

            <property name="message"
                value="Consider using special escape sequence instead of octal value or Unicode escaped value." />

        module>
        
        <module name="AvoidEscapedUnicodeCharacters">
            <property name="allowEscapesForControlCharacters" value="true" />
            <property name="allowByTailComment" value="true" />
            <property name="allowNonPrintableEscapes" value="true" />
        module>
        
        <module name="LineLength">
            <property name="max" value="200" />
            
            <property name="ignorePattern"
                value="^package.*|^import.*|a href|href|http://|https://|ftp://" />

        module>
        
        <module name="AvoidStarImport" />
        
        <module name="OneTopLevelClass" />
        
        <module name="NoLineWrap" />
        
        <module name="EmptyBlock">
            <property name="option" value="TEXT" />
            <property name="tokens"
                value="LITERAL_TRY, LITERAL_FINALLY, LITERAL_IF, LITERAL_ELSE, LITERAL_SWITCH" />

        module>
        
        <module name="NeedBraces">
            
            <property name="allowSingleLineStatement" value="true" />
        module>
        
        <module name="LeftCurly" />
        
        <module name="RightCurly">
            <property name="id" value="RightCurlySame" />
            <property name="tokens"
                value="LITERAL_TRY, LITERAL_CATCH, LITERAL_FINALLY, LITERAL_IF, LITERAL_ELSE, LITERAL_DO" />

        module>
        <module name="RightCurly">
            <property name="id" value="RightCurlyAlone" />
            <property name="option" value="alone" />
            <property name="tokens"
                value="CLASS_DEF, METHOD_DEF, CTOR_DEF, LITERAL_FOR, LITERAL_WHILE, STATIC_INIT, INSTANCE_INIT" />

        module>
        
        <module name="WhitespaceAround">
            <property name="allowEmptyConstructors" value="true" />
            <property name="allowEmptyMethods" value="true" />
            <property name="allowEmptyTypes" value="true" />
            <property name="allowEmptyLoops" value="true" />
            <message key="ws.notFollowed"
                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)" />

            <message key="ws.notPreceded"
                value="WhitespaceAround: ''{0}'' is not preceded with whitespace." />

        module>
        
        <module name="OneStatementPerLine" />
        
        <module name="MultipleVariableDeclarations" />
        
        <module name="ArrayTypeStyle" />
        
        <module name="MissingSwitchDefault" />
        
        <module name="FallThrough" />
        
        <module name="UpperEll" />
        
        <module name="ModifierOrder" />
        
        <module name="EmptyLineSeparator">
            
            <property name="allowNoEmptyLineBetweenFields" value="true" />
        module>
        
        <module name="SeparatorWrap">
            <property name="id" value="SeparatorWrapDot" />
            <property name="tokens" value="DOT" />
            <property name="option" value="nl" />
        module>
        <module name="SeparatorWrap">
            <property name="id" value="SeparatorWrapComma" />
            <property name="tokens" value="COMMA" />
            <property name="option" value="EOL" />
        module>
        <module name="SeparatorWrap">
            
            <property name="id" value="SeparatorWrapEllipsis" />
            <property name="tokens" value="ELLIPSIS" />
            <property name="option" value="EOL" />
        module>
        <module name="SeparatorWrap">
            
            <property name="id" value="SeparatorWrapArrayDeclarator" />
            <property name="tokens" value="ARRAY_DECLARATOR" />
            <property name="option" value="EOL" />
        module>
        <module name="SeparatorWrap">
            <property name="id" value="SeparatorWrapMethodRef" />
            <property name="tokens" value="METHOD_REF" />
            <property name="option" value="nl" />
        module>
        
        <module name="PackageName">
            <property name="format" value="^[a-z]+(\.[a-z][a-z0-9]*)*$" />
            <message key="name.invalidPattern"
                value="Package name ''{0}'' must match pattern ''{1}''." />

        module>
        
        <module name="TypeName">
            <message key="name.invalidPattern"
                value="Type name ''{0}'' must match pattern ''{1}''." />

        module>
        
        <module name="MemberName">
            <property name="format" value="^[a-z][a-zA-Z0-9]*$" />
            <message key="name.invalidPattern"
                value="Member name ''{0}'' must match pattern ''{1}''." />

        module>
        
        <module name="ParameterName">
            <property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$" />
            <message key="name.invalidPattern"
                value="Parameter name ''{0}'' must match pattern ''{1}''." />

        module>
        
        <module name="LambdaParameterName">
            <property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$" />
            <message key="name.invalidPattern"
                value="Lambda parameter name ''{0}'' must match pattern ''{1}''." />

        module>
        
        <module name="CatchParameterName">
            <property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$" />
            <message key="name.invalidPattern"
                value="Catch parameter name ''{0}'' must match pattern ''{1}''." />

        module>
        
        <module name="LocalVariableName">
            <property name="tokens" value="VARIABLE_DEF" />
            <property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$" />
            <message key="name.invalidPattern"
                value="Local variable name ''{0}'' must match pattern ''{1}''." />

        module>
        
        <module name="ClassTypeParameterName">
            <property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)" />
            <message key="name.invalidPattern"
                value="Class type name ''{0}'' must match pattern ''{1}''." />

        module>
        
        <module name="MethodTypeParameterName">
            <property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)" />
            <message key="name.invalidPattern"
                value="Method type name ''{0}'' must match pattern ''{1}''." />

        module>
        
        <module name="InterfaceTypeParameterName">
            <property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)" />
            <message key="name.invalidPattern"
                value="Interface type name ''{0}'' must match pattern ''{1}''." />

        module>
        
        <module name="NoFinalizer" />
 
        <module name="GenericWhitespace">
            <message key="ws.followed"
                value="GenericWhitespace ''{0}'' is followed by whitespace." />

            <message key="ws.preceded"
                value="GenericWhitespace ''{0}'' is preceded with whitespace." />

            <message key="ws.illegalFollow"
                value="GenericWhitespace ''{0}'' should followed by whitespace." />

            <message key="ws.notPreceded"
                value="GenericWhitespace ''{0}'' is not preceded with whitespace." />

        module>
        
        <module name="Indentation">
            
            <property name="basicOffset" value="4" />
            
            <property name="braceAdjustment" value="0" />
            <property name="caseIndent" value="4" />
            <property name="throwsIndent" value="4" />
            <property name="lineWrappingIndentation" value="4" />
            <property name="arrayInitIndent" value="4" />
        module>
        
        <module name="AbbreviationAsWordInName">
            <property name="ignoreFinal" value="false" />
            <property name="allowedAbbreviationLength" value="3" />
        module>
        
        <module name="OverloadMethodsDeclarationOrder" />
        
        <module name="VariableDeclarationUsageDistance" />
        
        <module name="CustomImportOrder">
            
            <property name="sortImportsInGroupAlphabetically" value="false" />
            <property name="separateLineBetweenGroups" value="true" />
            <property name="customImportOrderRules" value="STATIC###THIRD_PARTY_PACKAGE" />
        module>
        
        <module name="MethodParamPad" />
        
        <module name="NoWhitespaceBefore">
            <property name="tokens"
                value="COMMA, SEMI, POST_INC, POST_DEC, DOT, ELLIPSIS, METHOD_REF" />

            <property name="allowLineBreaks" value="true" />
        module>
        
        <module name="ParenPad" />
        
        <module name="OperatorWrap">
            <property name="option" value="NL" />
            <property name="tokens" value="BAND, BOR, BSR, BXOR, DIV, EQUAL, GE, GT, LAND, LE, LITERAL_INSTANCEOF, LOR,
                    LT, MINUS, MOD, NOT_EQUAL, PLUS, QUESTION, SL, SR, STAR, METHOD_REF "
 />

        module>
        
        <module name="AnnotationLocation">
            <property name="id" value="AnnotationLocationMostCases" />
            <property name="tokens"
                value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, METHOD_DEF, CTOR_DEF" />

        module>
 
        <module name="AnnotationLocation">
            <property name="id" value="AnnotationLocationVariables" />
            <property name="tokens" value="VARIABLE_DEF" />
            <property name="allowSamelineMultipleAnnotations" value="true" />
        module>
        
        <module name="NonEmptyAtclauseDescription" />
        
        <module name="JavadocTagContinuationIndentation" />
        
        <module name="SummaryJavadoc">
            <property name="forbiddenSummaryFragments"
                value="^@return the *|^This method returns |^A [{]@code [a-zA-Z0-9]+[}]( is a )" />

            
            <property name="period" value="" />
        module>
        
        <module name="JavadocParagraph" />
        
        <module name="AtclauseOrder">
            <property name="tagOrder" value="@param, @return, @throws, @deprecated" />
            <property name="target"
                value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, METHOD_DEF, CTOR_DEF, VARIABLE_DEF" />

        module>
        
        <module name="JavadocMethod">
            <property name="allowMissingJavadoc" value="true" />
            <property name="scope" value="public" />
            <property name="allowMissingParamTags" value="true" />
            <property name="allowMissingThrowsTags" value="true" />
            <property name="allowMissingReturnTag" value="true" />
            <property name="minLineCount" value="2" />
            <property name="allowedAnnotations" value="Override, Test" />
            <property name="allowThrowsTagsForSubclasses" value="true" />
        module>
        
        <module name="MethodName">
            <property name="format" value="^[a-z][a-z0-9][a-zA-Z0-9_]*$" />
            <message key="name.invalidPattern"
                value="Method name ''{0}'' must match pattern ''{1}''." />

        module>
        
        <module name="SingleLineJavadoc">
            <property name="ignoreInlineTags" value="false" />
        module>
        
        <module name="EmptyCatchBlock">
            <property name="exceptionVariableName" value="expected" />
        module>
        
        <module name="CommentsIndentation" />
    module>
module>


三、配置


将 xml 文件放到一个路径下, 打开 eclipse ,新建一个规范的配置,如下所示:



配置checkstyle,点OK后弹出窗确定即可。



四、启动配置 


右键项目 --> properties --> Checkstyle









关注GitHub今日热榜,专注挖掘好用的开发工具,致力于分享优质高效的工具、资源、插件等,助力开发者成长!







点个在看 你最好看










浏览 49
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报