還在為代碼的規(guī)范問題頭疼嗎?CheckStyle來了解一下

CheckStyle 是 SourceForge 下的一個(gè)項(xiàng)目,提供了一個(gè)幫助 Java 開發(fā)人員遵守某些編碼規(guī)范的工具。開發(fā)人員能夠根據(jù)已經(jīng)設(shè)置好的編碼規(guī)則來自動(dòng)地檢查自己所寫的代碼,例如:方法的命名、方法的函數(shù)、變量的命名等是否符合規(guī)范。也就是說,只要設(shè)置好了規(guī)則,CheckStyle 就可以根據(jù)規(guī)則自動(dòng)地檢查代碼中不符合要求的地方,聽上去就是一個(gè)很解放人力的工具,接下來具體地了解一下這個(gè)工具吧!
CheckStyle?除了上面說的檢查方法、變量的命名以及方法的函數(shù)之外,還有很多可以檢驗(yàn)的內(nèi)容,例如:Javadoc 注釋,命名約定,標(biāo)題,import 語句,空白,修飾符,代碼塊以及類設(shè)計(jì)等。既然功能這么齊全,如何使用呢?
一、下載和安裝
CheckStyle?的下載可以去官網(wǎng)。官網(wǎng)鏈接:http://checkstyle.sourceforge.net/。
接下來的安裝教程是基于 Eclipse 的。
1、打開eclipse, help->Install New Software... ?? 然后填入:CheckStyle - http://eclipse-cs.sourceforge.NET/update

2、選中上圖的兩個(gè)文件,依次點(diǎn)擊 Next -->Next,選中I accept .....,F(xiàn)inish。


3、點(diǎn)擊 Install anyway 。

4、點(diǎn)擊重啟,生效。

二、導(dǎo)入?CheckStyle?規(guī)范
CheckStyle 的規(guī)范一個(gè) xml 文件,格式可以從網(wǎng)上下載,然后根據(jù)自己的需要進(jìn)行修改。例如:
<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="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 文件放到一個(gè)路徑下,?打開 eclipse ,新建一個(gè)規(guī)范的配置,如下所示:
配置checkstyle,點(diǎn)OK后彈出窗確定即可。
四、啟動(dòng)配置?
右鍵項(xiàng)目 --> properties --> Checkstyle
關(guān)注GitHub今日熱榜,專注挖掘好用的開發(fā)工具,致力于分享優(yōu)質(zhì)高效的工具、資源、插件等,助力開發(fā)者成長!
點(diǎn)個(gè)在看 你最好看

