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è)名為Checkermodule作為root節(jié)點(diǎn),一般的checker都會(huì)包括TreeWalkermodule。我們可以參照checkstyle中的sun_checks.xml,這是根據(jù)sunjava語(yǔ)言規(guī)范寫(xiě)的配置。

xml配置文件中通過(guò)modulename屬性來(lái)區(qū)分module,moduleProperties可以控制如何去執(zhí)行這個(gè)module,每個(gè)property都有一個(gè)默認(rèn)值,所有的check都有一個(gè)severity屬性,用它來(lái)指定checklevel。TreeWalker為每個(gè)java文件創(chuàng)建一個(gè)語(yǔ)法樹(shù),在節(jié)點(diǎn)之間調(diào)用submodulesChecks。

下面來(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ǔ)句是否有defaultclause。

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

檢查defaultclause是否在switch代碼段的最后。

l         MissingCtor

檢查類(lèi)依賴(lài)。

l         FallThrough

檢查switch代碼的case中是否缺少breakreturnthrowcontinue。

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

“)” 前面不能有空格