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