Java-idea-Checkstyle自動化代碼規范檢查


一、概述

  CheckStyle是SourceForge下的一個項目,提供了一個幫助JAVA開發人員遵守某些編碼規范的工具。它能夠自動化代碼規范檢查過程,從而使得開發人員從這項重要,但是枯燥的任務中解脫出來。

  CheckStyle是SourceForge下的一個項目,提供了一個幫助JAVA開發人員遵守某些編碼規范的工具。它能夠自動化代碼規范檢查過程,從而使得開發人員從這項重要,但是枯燥的任務中解脫出來。
  CheckStyle檢驗的主要內容
    ·Javadoc注釋
    ·命名約定
    ·標題
    ·Import語句
    ·體積大小
    ·空白
    ·修飾符
    ·塊
    ·代碼問題
    ·類設計
    ·混合檢查(包括一些有用的比如非必須的System.out和printstackTrace)
  從上面可以看出,CheckStyle提供了大部分功能都是對於代碼規范的檢查,而沒有提供象PMD和Jalopy那么多的增強代碼質量和修改代碼的功能。但是,對於團隊開發,尤其是強調代碼規范的公司來說,它的功能已經足夠強大。

二、官方地址

  地址:http://checkstyle.sourceforge.net/

三、idea使用

  1、安裝
    File→setting→plugins→checkstyle
    安裝即可
  2、配置idea_checks.xml
    File→setting→Other Settings→checkstyle
    此時默認有一個sun_check.xml
    Checkstyle默認的設置就是sun_checks.xml配置文件,一般Sun Checks的檢查項限定得較為嚴格,我們實際項目中並不要求那么完美的編程規范,那么可以自己定義檢查的配置文件,最后將Checkstyle的配置文件設定為我們自定義的文件即可。
  自定義配置
    xml文件,idea_checks.xml
    
<?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">
    <!--
        If you set the basedir property below, then all reported file
        names will be relative to the specified directory. See
        http://checkstyle.sourceforge.net/5.x/config.html#Checker

        <property name="basedir" value="${basedir}"/>
    -->

    <!-- 檢查每個包中是否有java注釋文件,默認有package-info.java -->
    <!-- <module name="JavadocPackage"/> -->

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

    <!-- 檢查property文件中是否有相同的key -->
    <module name="Translation"/>

    <!-- 文件長度不超過1500行 --> 
    <module name="FileLength">
        <property name="max" value="1500"/>
     </module>
    
    <!-- 檢查文件中是否含有'\t' -->
    <module name="FileTabCharacter"/>

    <!-- Miscellaneous other checks. -->
    <module name="RegexpSingleline">
       <property name="format" value="\s+$"/>
       <property name="minimum" value="0"/>
       <property name="maximum" value="0"/>
       <property name="message" value="Line has trailing spaces."/>
    </module>


    

    <!-- 每個java文件一個語法樹 -->
    <module name="TreeWalker">
        <!-- 注釋檢查 -->
        <!-- 檢查方法和構造函數的javadoc -->
        <module name="JavadocMethod">
            <property name="tokens" value="METHOD_DEF" />
            
        </module>
        <!-- 檢查類和接口的javadoc。默認不檢查author和version tags -->
        <module name="JavadocType"/>
        <!-- 檢查變量的javadoc -->
        <module name="JavadocVariable"/>
        <!-- 檢查javadoc的格式 -->
        <module name="JavadocStyle">
           <property name="checkFirstSentence" value="false"/>
        </module>
        <!-- 檢查TODO:注釋 -->
        <module name="TodoComment"/>

        <!-- 命名檢查 --> 
        <!-- 局部的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"/>
        <!-- 檢查方法名、構造函數、catch塊的參數是否是final的 -->
        <!-- <module name="FinalParameters"/> -->
        <!-- 檢查long型定義是否有大寫的“L” -->
        <module name="UpperEll"/>
        

        <!-- Checks for Headers                                -->
        <!-- See http://checkstyle.sf.net/config_header.html   -->
        <!-- <module name="Header">                            -->
            <!-- The follow property value demonstrates the ability     -->
            <!-- to have access to ANT properties. In this case it uses -->
            <!-- the ${basedir} property to allow Checkstyle to be run  -->
            <!-- from any directory within a project. See property      -->
            <!-- expansion,                                             -->
            <!-- http://checkstyle.sf.net/config.html#properties        -->
            <!-- <property                                              -->
            <!--     name="headerFile"                                  -->
            <!--     value="${basedir}/java.header"/>                   -->
        <!-- </module> -->

        <!-- Following interprets the header file as regular expressions. -->
        <!-- <module name="RegexpHeader"/>                                -->


        <!-- import檢查-->
        <!-- 避免使用* -->
        <module name="AvoidStarImport"/>
        <!-- 檢查是否從非法的包中導入了類 -->
        <module name="IllegalImport"/>
        <!-- 檢查是否導入了多余的包 -->
        <module name="RedundantImport"/>
        <!-- 沒用的import檢查,比如:1.沒有被用到2.重復的3.import java.lang的4.import 與該類在同一個package的 -->   
        <module name="UnusedImports" />

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

        <!-- 空格檢查-->  
        <!-- 方法名后跟左圓括號"(" -->   
        <module name="MethodParamPad" />   
        <!-- 在類型轉換時,不允許左圓括號右邊有空格,也不允許與右圓括號左邊有空格 -->   
        <module name="TypecastParenPad" />
        <!-- Iterator -->
        <!-- <module name="EmptyForIteratorPad"/> -->
        <!-- 檢查尖括號 -->
        <!-- <module name="GenericWhitespace"/> -->
        <!-- 檢查在某個特定關鍵字之后應保留空格 -->
        <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="AvoidInlineConditionals"/> -->
        <!-- 檢查空的代碼段 -->
        <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 -->
        <!-- <module name="DesignForExtension"/> -->
        <!-- 檢查只有private構造函數的類是否聲明為final -->
        <module name="FinalClass"/>
        <!-- 檢查工具類是否有putblic的構造器 -->
        <module name="HideUtilityClassConstructor"/>
        <!-- 檢查接口是否僅定義類型 -->
        <module name="InterfaceIsType"/>
        <!-- 檢查類成員的可見度 -->
        <module name="VisibilityModifier"/>
        

        <!-- 其他檢查 -->
        <!-- 文件中使用了System.out.print等
        <module name="GenericIllegalRegexp">
            <property name="format" value="System\.out\.print"/>
        </module>
        <module name="GenericIllegalRegexp">
            <property name="format" value="System\.exit"/>
        </module>
        <module name="GenericIllegalRegexp">
            <property name="format" value="printStackTrace"/>
        </module>-->
        

        <!-- 代碼質量 -->
        <!-- 圈復雜度
        <module name="CyclomaticComplexity">
              <property name="max" value="2"/>
        </module> -->
    </module>

</module>
View Code

    添加選中即可

  3、啟用CheckStyle
    File→setting→Editor→Inspections→選中checkstyle
  4、使用
    在文件上右鍵,Check Current File即可


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM