1. 程式人生 > >符合阿里巴巴程式碼規範的checkstyle檢測檔案

符合阿里巴巴程式碼規範的checkstyle檢測檔案

一、安裝與簡介

eclipse和idea都有對應的外掛,找到外掛安裝介面。搜尋checkstyle,點選安裝後,重啟IDE即可。(網上有很多安裝教程,就不重複製造輪子了)

二、匯入配置檔案

在checkstyle的設定介面匯入我們自己寫的配置檔案。寫了兩個配置檔案,都是基本符合阿里巴巴規範的。第一個是比較精簡的(不檢測魔術數字,不檢測方法的doc等)。第二個是完整的,檢測規範較多,有些過於嚴苛了,個人使用了第一個規範配置。

精簡版

<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
    "-//Puppy Crawl//DTD Check Configuration 1.3//EN"
    "http://www.puppycrawl.com/dtds/configuration_1_3.dtd">
<module name="Checker"> <!-- 檢查檔案是否以一個空行結束 --> <module name="NewlineAtEndOfFile"/> <!-- 檔案長度不超過1500行 --> <module name="FileLength"> <property name="max" value="1500"/> </module> <!-- 每個java檔案一個語法樹 --> <module name="TreeWalker"
>
<!-- import檢查--> <!-- 檢查是否從非法的包中匯入了類 --> <module name="IllegalImport"/> <!-- 檢查是否匯入了多餘的包 --> <module name="RedundantImport"/> <!-- 沒用的import檢查,比如:1.沒有被用到2.重複的3.import java.lang的4.import 與該類在同一個package的 --> <module
name="UnusedImports" />
<!-- 註釋檢查 --> <!-- 檢查建構函式的javadoc --> <module name="JavadocType"> <property name="allowUnknownTags" value="true"/> <message key="javadoc.missing" value="類註釋:缺少Javadoc註釋。"/> </module> <!-- 命名檢查 --> <!-- 區域性的final變數,包括catch中的引數的檢查 --> <module name="LocalFinalVariableName" /> <!-- 區域性的非final型的變數,包括catch中的引數的檢查 --> <module name="LocalVariableName" /> <!-- 包名的檢查(只允許小寫字母),預設^[a-z]+(\.[a-zA-Z_][a-zA-Z_0-9_]*)*$ --> <module name="PackageName"> <property name="format" value="^[a-z]+(\.[a-z][a-z0-9]*)*$" /> <message key="name.invalidPattern" value="包名 ''{0}'' 要符合 ''{1}''格式."/> </module> <!-- 僅僅是static型的變數(不包括static final型)的檢查 --> <module name="StaticVariableName" /> <!-- Class或Interface名檢查,預設^[A-Z][a-zA-Z0-9]*$--> <module name="TypeName"> <property name="severity" value="warning"/> <message key="name.invalidPattern" value="名稱 ''{0}'' 要符合 ''{1}''格式."/> </module> <!-- 非static型變數的檢查 --> <module name="MemberName" /> <!-- 方法名的檢查 --> <module name="MethodName" /> <!-- 方法的引數名 --> <module name="ParameterName " /> <!-- 常量名的檢查(只允許大寫),預設^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$ --> <module name="ConstantName" /> <!-- 定義檢查 --> <!-- 檢查陣列型別定義的樣式 --> <module name="ArrayTypeStyle"/> <!-- 檢查long型定義是否有大寫的“L” --> <module name="UpperEll"/> <!-- 長度檢查 --> <!-- 每行不超過140個字元 --> <module name="LineLength"> <property name="max" value="140" /> </module> <!-- 方法不超過50行 --> <module name="MethodLength"> <property name="tokens" value="METHOD_DEF" /> <property name="max" value="50" /> </module> <!-- 方法的引數個數不超過5個。 並且不對構造方法進行檢查--> <module name="ParameterNumber"> <property name="max" value="5" /> <property name="ignoreOverriddenMethods" value="true"/> <property name="tokens" value="METHOD_DEF" /> </module> <!-- 空格檢查--> <!-- 方法名後跟左圓括號"(" --> <module name="MethodParamPad" /> <!-- 在型別轉換時,不允許左圓括號右邊有空格,也不允許與右圓括號左邊有空格 --> <module name="TypecastParenPad" /> <!-- 檢查在某個特定關鍵字之後應保留空格 --> <module name="NoWhitespaceAfter"/> <!-- 檢查在某個特定關鍵字之前應保留空格 --> <module name="NoWhitespaceBefore"/> <!-- 操作符換行策略檢查 --> <module name="OperatorWrap"/> <!-- 圓括號空白 --> <module name="ParenPad"/> <!-- 檢查分隔符是否在空白之後 --> <module name="WhitespaceAfter"/> <!-- 檢查分隔符周圍是否有空白 --> <module name="WhitespaceAround"/> <!-- 修飾符檢查 --> <!-- 檢查修飾符的順序是否遵照java語言規範,預設public、protected、private、abstract、static、final、transient、volatile、synchronized、native、strictfp --> <module name="ModifierOrder"/> <!-- 檢查介面和annotation中是否有多餘修飾符,如介面方法不必使用public --> <module name="RedundantModifier"/> <!-- 程式碼塊檢查 --> <!-- 檢查是否有巢狀程式碼塊 --> <module name="AvoidNestedBlocks"/> <!-- 檢查是否有空程式碼塊 --> <module name="EmptyBlock"/> <!-- 檢查左大括號位置 --> <module name="LeftCurly"/> <!-- 檢查程式碼塊是否缺失{} --> <module name="NeedBraces"/> <!-- 檢查右大括號位置 --> <module name="RightCurly"/> <!-- 程式碼檢查 --> <!-- 檢查空的程式碼段 --> <module name="EmptyStatement"/> <!-- 檢查在重寫了equals方法後是否重寫了hashCode方法 --> <module name="EqualsHashCode"/> <!-- 檢查區域性變數或引數是否隱藏了類中的變數 --> <module name="HiddenField"> <property name="tokens" value="VARIABLE_DEF"/> </module> <!-- 檢查子表示式中是否有賦值操作 --> <module name="InnerAssignment"/> <!-- 檢查switch語句是否有default --> <module name="MissingSwitchDefault"/> <!-- 檢查是否有過度複雜的布林表示式 --> <module name="SimplifyBooleanExpression"/> <!-- 檢查是否有過於複雜的布林返回程式碼段 --> <module name="SimplifyBooleanReturn"/> <!-- 類設計檢查 --> <!-- 檢查類是否為擴充套件設計l --> <!-- 檢查只有private建構函式的類是否宣告為final --> <module name="FinalClass"/> <!-- 檢查介面是否僅定義型別 --> <module name="InterfaceIsType"/> <!-- 檢查類成員的可見度 檢查類成員的可見性。只有static final 成員是public的 除非在本檢查的protectedAllowed和packagedAllowed屬性中進行了設定--> <module name="VisibilityModifier"> <property name="packageAllowed" value="true"/> <property name="protectedAllowed" value="true"/> </module> <!-- 語法 --> <!-- String的比較不能用!= 和 == --> <module name="StringLiteralEquality"/> <!-- 限制for迴圈最多巢狀2層 --> <module name="NestedForDepth"> <property name="max" value="2"/> </module> <!-- if最多巢狀3層 --> <module name="NestedIfDepth"> <property name="max" value="3"/> </module> <!-- 檢查未被註釋的main方法,排除以Appllication結尾命名的類 --> <module name="UncommentedMain"> <property name="excludedClasses" value=".*[Application,Test]$"/> </module> <!-- 禁止使用System.out.println --> <module name="Regexp"> <property name="format" value="System\.out\.println"/> <property name="illegalPattern" value="true"/> </module> <!-- return個數 3個--> <module name="ReturnCount"> <property name="max" value="3"/> </module> <!--try catch 異常處理數量 3--> <module name="NestedTryDepth "> <property name="max" value="3"/> </module> <!-- clone方法必須呼叫了super.clone() --> <module name="SuperClone" /> <!-- finalize 必須呼叫了super.finalize() --> <module name="SuperFinalize" />

完整版

<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
    "-//Puppy Crawl//DTD Check Configuration 1.3//EN"
    "http://www.puppycrawl.com/dtds/configuration_1_3.dtd">

<module name="Checker">

    <!-- 檢查檔案是否以一個空行結束 -->
    <module name="NewlineAtEndOfFile"/>

    <!-- 檔案長度不超過1500行 -->
    <module name="FileLength">
        <property name="max" value="1500"/>
     </module>

    <!-- 每個java檔案一個語法樹 -->
    <module name="TreeWalker">
        <!-- import檢查-->
        <!-- 避免使用* -->
        <module name="AvoidStarImport">
            <property name="excludes" value="java.io,java.net,java.lang.Math"/>
            <!-- 例項;import java.util.*;.-->
            <property name="allowClassImports" value="false"/>
            <!-- 例項 ;import static org.junit.Assert.*;-->
            <property name="allowStaticMemberImports" value="true"/>
        </module>
        <!-- 檢查是否從非法的包中匯入了類 -->
        <module name="IllegalImport"/>
        <!-- 檢查是否匯入了多餘的包 -->
        <module name="RedundantImport"/>
        <!-- 沒用的import檢查,比如:1.沒有被用到2.重複的3.import java.lang的4.import 與該類在同一個package的 -->   
        <module name="UnusedImports" />


        <!-- 註釋檢查 -->
        <!-- 檢查方法和建構函式的javadoc -->
        <module name="JavadocType">
            <property name="allowUnknownTags" value="true"/>
            <message key="javadoc.missing" value="類註釋:缺少Javadoc註釋。"/>
        </module>
        <module name="JavadocMethod">
            <property name="tokens" value="METHOD_DEF" />
            <!--允許get set 方法沒有註釋-->
            <property name="allowMissingPropertyJavadoc" value="true"/>
            <message key="javadoc.missing" value="方法註釋:缺少Javadoc註釋。"/>
        </module>

        <!-- 命名檢查 -->
        <!-- 區域性的final變數,包括catch中的引數的檢查 -->
        <module name="LocalFinalVariableName" />
        <!-- 區域性的非final型的變數,包括catch中的引數的檢查 -->
        <module name="LocalVariableName" />
        <!-- 包名的檢查(只允許小寫字母),預設^[a-z]+(\.[a-zA-Z_][a-zA-Z_0-9_]*)*$ -->
        <module name="PackageName">
            <property name="format" value="^[a-z]+(\.[a-z][a-z0-9]*)*$" />
            <message key="name.invalidPattern" value="包名 ''{0}'' 要符合 ''{1}''格式."/>
        </module>
        <!-- 僅僅是static型的變數(不包括static final型)的檢查 -->
        <module name="StaticVariableName" />
        <!-- Class或Interface名檢查,預設^[A-Z][a-zA-Z0-9]*$-->
        <module name="TypeName">
             <property name="severity" value="warning"/>
             <message key="name.invalidPattern" value="名稱 ''{0}'' 要符合 ''{1}''格式."/>
        </module>
        <!-- 非static型變數的檢查 -->
        <module name="MemberName" />
        <!-- 方法名的檢查 -->
        <module name="MethodName" />
        <!-- 方法的引數名 -->
        <module name="ParameterName " />
        <!-- 常量名的檢查(只允許大寫),預設^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$ -->
        <module name="ConstantName" />

        <!-- 定義檢查 -->
        <!-- 檢查陣列型別定義的樣式 -->
        <module name="ArrayTypeStyle"/>
        <!-- 檢查long型定義是否有大寫的“L” -->
        <module name="UpperEll"/>

        <!-- 長度檢查 -->
        <!-- 每行不超過120個字元 -->
        <module name="LineLength">
            <property name="max" value="120" />
        </module>
        <!-- 方法不超過50行 -->
        <module name="MethodLength">
            <property name="tokens" value="METHOD_DEF" />
            <property name="max" value="50" />
        </module>
        <!-- 方法的引數個數不超過5個。 並且不對構造方法進行檢查-->
        <module name="ParameterNumber">
            <property name="max" value="5" />
            <property name="ignoreOverriddenMethods" value="true"/>
            <property name="tokens" value="METHOD_DEF" />
        </module>

        <!-- 空格檢查-->
        <!-- 方法名後跟左圓括號"(" -->
        <module name="MethodParamPad" />
        <!-- 在型別轉換時,不允許左圓括號右邊有空格,也不允許與右圓括號左邊有空格 -->
        <module name="TypecastParenPad" />
        <!-- 檢查在某個特定關鍵字之後應保留空格 -->
        <module name="NoWhitespaceAfter"/>
        <!-- 檢查在某個特定關鍵字之前應保留空格 -->
        <module name="NoWhitespaceBefore"/>
        <!-- 操作符換行策略檢查 -->
        <module name="OperatorWrap"/>
        <!-- 圓括號空白 -->
        <module name="ParenPad"/>
        <!-- 檢查分隔符是否在空白之後 -->
        <module name="WhitespaceAfter"/>
        <!-- 檢查分隔符周圍是否有空白 -->
        <module name="WhitespaceAround"/>

        <!-- 修飾符檢查 -->
        <!-- 檢查修飾符的順序是否遵照java語言規範,預設public、protected、private、abstract、static、final、transient、volatile、synchronized、native、strictfp -->
        <module name="ModifierOrder"/>
        <!-- 檢查介面和annotation中是否有多餘修飾符,如介面方法不必使用public -->
        <module name="RedundantModifier"/>

        <!-- 程式碼塊檢查 -->
        <!-- 檢查是否有巢狀程式碼塊 -->
        <module name="AvoidNestedBlocks"/>
        <!-- 檢查是否有空程式碼塊 -->
        <module name="EmptyBlock"/>
        <!-- 檢查左大括號位置 -->
        <module name="LeftCurly"/>
        <!-- 檢查程式碼塊是否缺失{} -->
        <module name="NeedBraces"/>
        <!-- 檢查右大括號位置 -->
        <module name="RightCurly"/>

        <!-- 程式碼檢查 -->
        <!-- 檢查空的程式碼段 -->
        <module name="EmptyStatement"/>
        <!-- 檢查在重寫了equals方法後是否重寫了hashCode方法 -->
        <module name="EqualsHashCode"/>
        <!-- 檢查區域性變數或引數是否隱藏了類中的變數 -->
        <module name="HiddenField">
            <property name="tokens" value="VARIABLE_DEF"/>
        </module>
        <!-- 檢查是否使用工廠方法例項化 -->
        <module name="IllegalInstantiation"/>
        <!-- 檢查子表示式中是否有賦值操作 -->
        <module name="InnerAssignment"/>
        <!-- 檢查是否有"魔術"數字 -->
        <module name="MagicNumber">
           <property name="ignoreNumbers" value="0, 1"/>
           <property name="ignoreAnnotation" value="true"/>
       </module>
        <!-- 檢查switch語句是否有default -->
        <module name="MissingSwitchDefault"/>
        <!-- 檢查是否有過度複雜的布林表示式 -->
        <module name="SimplifyBooleanExpression"/>
        <!-- 檢查是否有過於複雜的布林返回程式碼段 -->
        <module name="SimplifyBooleanReturn"/>

        <!-- 類設計檢查 -->
        <!-- 檢查類是否為擴充套件設計l -->
        <!-- 檢查只有private建構函式的類是否宣告為final -->
        <module name="FinalClass"/>
        <!-- 檢查工具類是否有putblic的構造器 -->
        <module name="HideUtilityClassConstructor"/>
        <!-- 檢查介面是否僅定義型別 -->
        <module name="InterfaceIsType"/>
        <!-- 檢查類成員的可見度 檢查類成員的可見性。只有static final 成員是public的 
        除非在本檢查的protectedAllowed和packagedAllowed屬性中進行了設定-->
        <module name="VisibilityModifier">
            <property name="packageAllowed" value="true"/>
            <property name="protectedAllowed" value="true"/>
        </module>

        <!-- 語法 -->
        <!-- String的比較不能用!= 和 == -->
        <module name="StringLiteralEquality"/>
        <!-- 限制for迴圈最多巢狀2層 -->
        <module name="NestedForDepth">
            <property name="max" value="2"/>
        </module>
        <!-- if最多巢狀3層 -->
        <module name="NestedIfDepth">
            <property name="max" value="3"/>
        </module>
        <!-- 檢查未被註釋的main方法,排除以Appllication結尾命名的類 -->
        <module name="UncommentedMain">
            <property name="excludedClasses" value=".*Application$"/>
        </module>
        <!-- 禁止使用System.out.println -->
        <module name="Regexp">
            <property name="format" value="System\.out\.println"/>
            <property name="illegalPattern" value="true"/>
        </module>
        <!-- return個數 3個-->
        <module name="ReturnCount">
            <property name="max" value="3"/>
        </module>
        <!--try catch 異常處理數量 3-->
        <module name="NestedTryDepth ">
            <property name="max" value="3"/>
        </module>
        <!-- clone方法必須呼叫了super.clone() -->
        <module name="SuperClone" />
        <!-- finalize 必須呼叫了super.finalize() -->
        <module name="SuperFinalize" />