Checkstyle
是一款檢查java
程序代碼樣式的工具,可以有效的幫助我們檢視代碼以便更好的遵循代碼編寫(xiě)標(biāo)準(zhǔn),特別適用于小組開(kāi)發(fā)時(shí)彼此間的樣式規(guī)范和統(tǒng)一。Checkstyle
提供了高可配置性,以便適用于各種代碼規(guī)范,所以除了可以使用它提供的sun
的代碼標(biāo)準(zhǔn)外,你也可以定制自己的標(biāo)準(zhǔn)。我們可以在eclipse
中安裝checkstyle
的插件,來(lái)方便我們的使用。
Checkstyle可以讓我們養(yǎng)成書(shū)寫(xiě)良好代碼風(fēng)格的習(xí)慣,代碼的整潔也減少了很多bad smell的產(chǎn)生。使用checkstyle的過(guò)程中可能需要經(jīng)常的調(diào)整配置文件,有些check過(guò)于嚴(yán)格,可以根據(jù)實(shí)際情況取消一些代碼檢查。
Checkstyle的配置
Checkstyle配置是通過(guò)指定modules來(lái)應(yīng)用到java文件的。modules是樹(shù)狀結(jié)構(gòu),以一個(gè)名為Checker的module作為root節(jié)點(diǎn),一般的checker都會(huì)包括TreeWalker子module。我們可以參照checkstyle中的sun_checks.xml,這是根據(jù)sun的java語(yǔ)言規(guī)范寫(xiě)的配置。
在xml配置文件中通過(guò)module的name屬性來(lái)區(qū)分module,module的Properties可以控制如何去執(zhí)行這個(gè)module,每個(gè)property都有一個(gè)默認(rèn)值,所有的check都有一個(gè)severity屬性,用它來(lái)指定check的level。TreeWalker為每個(gè)java文件創(chuàng)建一個(gè)語(yǔ)法樹(shù),在節(jié)點(diǎn)之間調(diào)用submodules的Checks。
下面來(lái)看看standard checks中的一些具體用法。
Javadoc Comments
l JavadocPackage
檢查每個(gè)java package中是否有java注釋文件,默認(rèn)是允許一個(gè)package-info.java,也可以通過(guò)allowLegacy屬性配置允許package.html。
l JavadocType
檢查類(lèi)和接口的javadoc。默認(rèn)不檢查author 和version tags。
l JavadocMethod
檢查方法和構(gòu)造函數(shù)的javadoc。默認(rèn)不檢查未使用的異常拋出。
l JavadocVariable
檢查變量的javadoc。
l JavadocStyle
檢查javadoc的格式。比如:javadoc的第一行是否以句號(hào)結(jié)束,javadoc除了tags外是否有description,檢查javadoc中的html格式。
l WriteTag
輸出javadoc中的tag。
Naming Conventions
l AbstractClassName
檢查抽象類(lèi)名。
l ClassTypeParameterName
檢查類(lèi)的Parameter名。
l ConstantName
檢查常量名。
l LocalFinalVariableName
檢查局部的final類(lèi)型變量名,包括catch的參數(shù)。
l LocalVarableName
檢查局部的非final類(lèi)型的變量名,包括catch的參數(shù)。
l MemberName
檢查非靜態(tài)變量。
l MethodName
檢查方法名。
l MethodTypeParameterName
檢查方法的參數(shù)名。
l PackageName
檢查包名。
l ParameterName
檢查參數(shù)名。
l StaticVariableName
檢查靜態(tài)的,非final類(lèi)型的變量名。
l TypeName
檢查類(lèi)名和接口名。
Imports
l AvoidStarImport
檢查是否有使用*進(jìn)行import。
l AvoidStaticImport
檢查是否有靜態(tài)import。比如是否導(dǎo)入了java.lang包中的內(nèi)容。
l IllegalImport
檢查是否import了違法的包。默認(rèn)拒絕import所有sun.*包。
l RedundanImport
檢查是否有重復(fù)的import。
l UnusedImports
檢查是否有未使用的import。
l ImportOrder
檢查import的分組和順序。
l ImportControl
控制可import的包。在一個(gè)較大的project可限制使用過(guò)多的第三方包,通過(guò)一個(gè)依照http://www.puppycrawl.com/dtds/import_control_1_0.dtd的xml文件來(lái)指定。
Size Violations
l ExecutableStatementCount
限制可執(zhí)行代碼片段的長(zhǎng)度。默認(rèn)為30。
l FileLength
檢查java文件的長(zhǎng)度。默認(rèn)為2000。
l LineLength
檢查代碼行的長(zhǎng)度。默認(rèn)為80。
l MethodLength
檢查方法和構(gòu)造函數(shù)的長(zhǎng)度。默認(rèn)為150。
l AnonInnerLength
檢查匿名內(nèi)部類(lèi)的長(zhǎng)度。默認(rèn)為20。
l ParameterNumber
檢查方法和構(gòu)造函數(shù)的參數(shù)個(gè)數(shù)。默認(rèn)為7。
Whitespace
l GenericWhitespace
檢查<和>周?chē)目瞻住?/span>
l EmptyForInitializerPad
檢查空的初始化位置的空白。比如for循環(huán)中的初始化。
l EmptyForIteratorPad
檢查空的迭代位置的空白。
l MethodParamPad
檢查方法簽名之前的空白。
l NoWhitespaceAfter
檢查分隔符后的空白。
l NoWhitespaceBefore
檢查分隔符前的空白。
l OperatorWrap
檢查操作符的空白規(guī)則。
l ParenPad
檢查圓括號(hào)的空白規(guī)則。
l TypecaseParenPad
檢查強(qiáng)制轉(zhuǎn)型的圓括號(hào)的空白規(guī)則。
l TabCharacter
檢查是否有Tab字符(’"t’)。
l WhitespaceAfter
檢查分隔符是否在空白之后。
l WhitespaceAround
檢查分隔符周?chē)欠裼锌瞻住?/span>
ModifierOrder
l ModifierOrder
檢查修飾符的順序是否遵照java語(yǔ)言規(guī)范。
l RedundantModifier
檢查接口和annotation中是否有重復(fù)的修飾符。
Block Checks
l EmptyBlock
檢查空的代碼塊。
l LeftCurly
檢查’{’和左邊的代碼塊是否在同一行。
l NeedBraces
檢查是否需要大括號(hào)。主要是在if,else時(shí)的情況。
l RightCurly
檢查’}’。
l AvoidNestedBlocks
檢查不需要的嵌套’{}’。
Coding
l ArrayTrailingComma
檢查數(shù)組初始化是否以逗號(hào)結(jié)束。
l AvoidInlineConditionals
檢查inline的條件操作。
l CovariantEquals
檢查類(lèi)是否覆蓋了equals(java.lang.Object)。
l DoubleCheckedLocking
檢查DCL的問(wèn)題。
l EmptyStatement
檢查空的代碼段。
l EqualsAvoidNull
檢查一個(gè)可能為null的字符串是否在equals()比較的左邊。
l EqualsHashCode
檢查類(lèi)是否覆蓋了equals()和hashCode()。
l FinalLocalVariable
檢查未改變過(guò)的局部變量是否聲明為final。
l HiddenField
檢查局部變量或參數(shù)是否隱藏了類(lèi)中的變量。
l IllegalInstantiation
檢查是否使用工廠方法實(shí)例化。
l IllegalToken
檢查非法的分隔符。
l IllegalTokenText
檢查非法的分隔符的下個(gè)字符。
l InnerAssignment
檢查子表達(dá)式中是否有賦值操作。
l MagicNumber
檢查是否有“magic numbers”。
l MissingSwitchDefault
檢查switch語(yǔ)句是否有default的clause。
l ModifiedControlVariable
檢查循環(huán)控制的變量是否在代碼塊中被修改。
l RedundantThrows
檢查是否有被重復(fù)拋出的異常。
l SimplifyBooleanExpression
檢查是否有過(guò)度復(fù)雜的布爾表達(dá)式。
l SimplifyBooleanReturn
檢查是否有過(guò)于復(fù)雜的布爾返回代碼段。
l StringLiteralEquality
檢查字符串是否有用= =或!=進(jìn)行操作。
l NestedIfDepth
檢查嵌套的層次深度。
l NestedTryDepth
檢查try的層次深度。
l NoClone
檢查是否覆蓋了clone()。
l NoFinalizer
檢查是否有定義finalize()。
l SuperClone
檢查覆蓋的clone()是否有調(diào)用super.clone()。
l SuperFinalize
檢查覆蓋的finalize()是否有調(diào)用super.finalize()。
l IllegalCatch
檢查是否catch了不能接受的錯(cuò)誤。
l IllegalThrows
檢查是否拋出了未聲明的異常。
l PackageDeclaration
檢查類(lèi)中是否有聲明package。
l JUnitTestCase
確保setUp(), tearDown()方法簽名的正確性。
l ReturnCount
限制return代碼段的數(shù)量。
l IllegalType
檢查未使用過(guò)的類(lèi)。
l DeclarationOrder
檢查類(lèi)和接口中的聲明順序。
l ParameterAssignment
檢查不允許的參數(shù)賦值。
l ExplicitInitialization
檢查類(lèi)和對(duì)象成員是否初始化為默認(rèn)值。
l DefaultComesLast
檢查default的clause是否在switch代碼段的最后。
l MissingCtor
檢查類(lèi)依賴(lài)。
l FallThrough
檢查switch代碼的case中是否缺少break,return,throw和continue。
l MultipleStringLiterals
檢查一個(gè)文件中是否有多次出現(xiàn)的字符串。
l MultipleVariableDeclarations
檢查代碼段和代碼行中是否有多次變量聲明。
l RequireThis
檢查代碼中是否有“this.”。
l UnnecessaryParentheses
檢查是否有使用不需要的圓括號(hào)。
Class Design
l VisibilityModifier
檢查類(lèi)成員的可見(jiàn)度。
l FinalClass
檢查只有private構(gòu)造函數(shù)的類(lèi)是否聲明為final。
l InterfaceIsType
檢查接口是否僅定義類(lèi)型。
l HideUtilityClassConstructor
檢查工具類(lèi)是否有putblic的構(gòu)造器。
l DesignForExension
檢查類(lèi)是否為擴(kuò)展設(shè)計(jì)。
l MutableException
確保異常是不可變的。
l ThrowsCount
限制拋出異常的數(shù)量。
Duplicate Code
l StrictDuplicateCode
嚴(yán)格檢查重復(fù)代碼。
Miscellaneous
l GenericIllegalRegexp
正則表達(dá)式的模式檢查。
l NewlineAtEndOfFile
檢查文件是否以一個(gè)空行結(jié)束。
l TodoComment
檢查TODO:注釋。
l Translation
檢查property文件中是否有相同的key。
l UncommentedMain
檢查是否有未注釋的main方法。
l UpperEll
檢查long型約束是否有大寫(xiě)的“L”。
l ArrayTypeStyle
檢查數(shù)組類(lèi)型定義的樣式。
l FinalParameters
檢查方法名、構(gòu)造函數(shù)、catch塊的參數(shù)是否是final的。
l Indentation
檢查代碼中正確的縮進(jìn)。
l TrailingComment
確保是否要代碼行注釋。
l RequiredRegexp
確保一個(gè)指定的正則表達(dá)式的規(guī)則已經(jīng)存在代碼中。
Checkstyle常見(jiàn)的錯(cuò)誤提示
1. Type is missing a javadoc commentClass
缺少類(lèi)型說(shuō)明
2. “{” should be on the previous line
“{” 應(yīng)該位于前一行
3. Methods is missing a javadoc comment
方法前面缺少javadoc注釋
4. Expected @throws tag for “Exception”
在注釋中希望有@throws的說(shuō)明
5. “.” Is preceeded with whitespace “.”
前面不能有空格
6. “.” Is followed by whitespace“.”
后面不能有空格
7. “=” is not preceeded with whitespace
“=” 前面缺少空格
8. “=” is not followed with whitespace
“=” 后面缺少空格
9. “}” should be on the same line
“}” 應(yīng)該與下條語(yǔ)句位于同一行
10. Unused @param tag for “unused”
沒(méi)有參數(shù)“unused”,不需注釋
11. Variable “CA” missing javadoc
變量“CA”缺少javadoc注釋
12. Line longer than 80characters
行長(zhǎng)度超過(guò)80
13. Line contains a tab character
行含有”tab” 字符
14. Redundant “Public” modifier
冗余的“public” modifier
15. Final modifier out of order with the JSL
suggestionFinal modifier的順序錯(cuò)誤
16. Avoid using the “.*” form of import
Import格式避免使用“.*”
17. Redundant import from the same package
從同一個(gè)包中Import內(nèi)容
18. Unused import-java.util.list
Import進(jìn)來(lái)的java.util.list沒(méi)有被使用
19. Duplicate import to line 13
重復(fù)Import同一個(gè)內(nèi)容
20. Import from illegal package
從非法包中 Import內(nèi)容
21. “while” construct must use “{}”
“while” 語(yǔ)句缺少“{}”
22. Variable “sTest1” must be private and have accessor method
變量“sTest1”應(yīng)該是private的,并且有調(diào)用它的方法
23. Variable “ABC” must match pattern “^[a-z][a-zA-Z0-9]*$”
變量“ABC”不符合命名規(guī)則“^[a-z][a-zA-Z0-9]*$”
24. “(” is followed by whitespace
“(” 后面不能有空格
25. “)” is proceeded by whitespace
“)” 前面不能有空格