公司做的是傳統B/S架構項目,所以以下配置參考了谷歌和阿里的標準修改而來,適合公司的基本規範。
CheckStyle配置參考官網:https://checkstyle.org/checks.html
<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
"-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
"https://checkstyle.org/dtds/configuration_1_3.dtd">
<module name="Checker">
<!-- Size Violations 行數、列數限制規範 -->
<!-- 文件長度不超過1500行 -->
<module name="FileLength">
<property name="max" value="1500"/>
</module>
<!-- 一行長度不超過120字符 -->
<module name="LineLength">
<property name="max" value="120"/>
<property name="ignorePattern" value="^package.*|^import.*|a href|href|http://|https://|ftp://"/>
</module>
<module name="FileTabCharacter">
<property name="eachLine" value="true"/>
</module>
<!-- Size Violations 行數、列數限制規範 -->
<!-- 檢查文件是否有製表位-->
<module name="TreeWalker">
<!-- Block Checks 代碼塊檢查 -->
<!-- 檢查是否有嵌套代碼塊 -->
<module name="AvoidNestedBlocks"/>
<!-- 不能有空代碼塊 -->
<module name="EmptyBlock">
<property name="option" value="TEXT"/>
<property name="tokens"
value="LITERAL_TRY, LITERAL_FINALLY, LITERAL_IF, LITERAL_ELSE, LITERAL_SWITCH"/>
</module>
<!-- 需要有括號 -->
<module name="NeedBraces">
<property name="tokens"
value="LITERAL_DO, LITERAL_ELSE, LITERAL_FOR, LITERAL_IF, LITERAL_WHILE"/>
</module>
<!-- 左括號 -->
<module name="LeftCurly">
<property name="tokens"
value="ANNOTATION_DEF, CLASS_DEF, CTOR_DEF, ENUM_CONSTANT_DEF, ENUM_DEF,
INTERFACE_DEF, LAMBDA, LITERAL_CASE, LITERAL_CATCH, LITERAL_DEFAULT,
LITERAL_DO, LITERAL_ELSE, LITERAL_FINALLY, LITERAL_FOR, LITERAL_IF,
LITERAL_SWITCH, LITERAL_SYNCHRONIZED, LITERAL_TRY, LITERAL_WHILE, METHOD_DEF,
OBJBLOCK, STATIC_INIT"/>
</module>
<!-- 右括號 -->
<module name="RightCurly">
<property name="id" value="RightCurlyAlone"/>
<property name="option" value="alone"/>
<property name="tokens"
value="CLASS_DEF, METHOD_DEF, CTOR_DEF, LITERAL_FOR, LITERAL_WHILE, STATIC_INIT,
INSTANCE_INIT, ANNOTATION_DEF, ENUM_DEF"/>
</module>
<!-- Block Checks 代碼塊檢查 -->
<!-- Class Design 類設計檢查 -->
<!-- 檢查只有private構造函數的類是否聲明爲final -->
<module name="FinalClass"/>
<!-- 檢查工具類是否有public的構造器 -->
<module name="HideUtilityClassConstructor"/>
<!-- 內部類聲明在最下面 -->
<module name="InnerTypeLast"/>
<!-- 一個文件裏不能有2個類 -->
<module name="OneTopLevelClass"/>
<!-- 檢查類成員的可見度 檢查類成員的可見性。只有static final 成員是public的
除非在本檢查的protectedAllowed和packagedAllowed屬性中進行了設置-->
<module name="VisibilityModifier">
<property name="packageAllowed" value="true"/>
<property name="protectedAllowed" value="true"/>
</module>
<!-- Class Design 類設計檢查 -->
<!-- Coding 代碼檢查 -->
<!-- 聲明順序 -->
<module name="DeclarationOrder"/>
<!-- default 在switch塊的最後、必須有break -->
<module name="DefaultComesLast"/>
<module name="FallThrough"/>
<!-- 檢查switch語句是否有default -->
<module name="MissingSwitchDefault"/>
<!-- 空代碼段 -->
<module name="EmptyStatement"/>
<!-- 字符串常量寫在equals左側 -->
<module name="EqualsAvoidNull"/>
<!-- 檢查局部變量或參數是否隱藏了類中的變量 -->
<module name="HiddenField">
<property name="tokens" value="VARIABLE_DEF"/>
</module>
<!-- 檢查是否使用工廠方法實例化 -->
<module name="IllegalInstantiation"/>
<!-- 檢查子表達式中是否有賦值操作 -->
<module name="InnerAssignment"/>
<!-- 變量一行一個 -->
<module name="MultipleVariableDeclarations"/>
<!-- 限制for循環最多嵌套3層 -->
<module name="NestedForDepth">
<property name="max" value="3"/>
</module>
<!-- if最多嵌套3層 -->
<module name="NestedIfDepth">
<property name="max" value="3"/>
</module>
<!--try catch 異常處理數量 3-->
<module name="NestedTryDepth ">
<property name="max" value="3"/>
</module>
<!-- 禁止一行有多條語句 -->
<module name="OneStatementPerLine"/>
<!-- 覆寫方法定義在一起 -->
<module name="OverloadMethodsDeclarationOrder"/>
<!-- String的比較不能用!= 和 == -->
<module name="StringLiteralEquality"/>
<!-- finalize 必須調用了super.finalize() -->
<module name="SuperFinalize"/>
<!-- Coding 代碼檢查 -->
<!-- imports 導入檢查-->
<!-- 避免使用* -->
<module name="AvoidStarImport">
<property name="excludes" value="java.io,java.net,java.lang.Math"/>
<property name="allowClassImports" value="false"/>
<property name="allowStaticMemberImports" value="false"/>
</module>
<!-- 不能靜態導入 -->
<module name="AvoidStaticImport"/>
<!-- 檢查是否從非法的包中導入了類 -->
<module name="IllegalImport"/>
<!-- 檢查是否導入了多餘的包 -->
<module name="RedundantImport"/>
<!-- 沒用的import檢查,比如:1.沒有被用到2.重複的3.import java.lang的4.import 與該類在同一個package的 -->
<module name="UnusedImports"/>
<!-- imports 導入檢查-->
<!-- javadoc 註釋檢查 -->
<!-- 標籤順序 -->
<module name="AtclauseOrder">
<property name="tagOrder" value="@param, @return, @throws, @deprecated"/>
<property name="target"
value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, METHOD_DEF, CTOR_DEF, VARIABLE_DEF"/>
</module>
<!-- 檢查註釋位置 -->
<module name="InvalidJavadocPosition"/>
<module name="JavadocMethod">
<property name="scope" value="public"/>
<property name="tokens" value="METHOD_DEF, CTOR_DEF, ANNOTATION_FIELD_DEF"/>
</module>
<!-- public 方法需要加註釋 -->
<module name="MissingJavadocMethod">
<property name="scope" value="public"/>
<property name="tokens" value="METHOD_DEF, CTOR_DEF, ANNOTATION_FIELD_DEF"/>
</module>
<!-- javadoc 註釋檢查 -->
<!-- miscellaneous 定義檢查 -->
<!-- 檢查數組類型定義的樣式 -->
<module name="ArrayTypeStyle"/>
<!-- 註釋與語句縮進字符一致 -->
<module name="CommentsIndentation">
<property name="tokens" value="SINGLE_LINE_COMMENT, BLOCK_COMMENT_BEGIN"/>
</module>
<!-- 縮進 -->
<module name="Indentation"/>
<!-- 類名是否與文件名相同 -->
<module name="OuterTypeFilename"/>
<!-- 檢查long型定義是否有大寫的“L” -->
<module name="UpperEll"/>
<!-- miscellaneous 定義檢查 -->
<!-- Modifier 修飾符檢查 -->
<!-- 檢查修飾符的順序是否遵照java語言規範,默認public、protected、private、abstract、static、final、transient、volatile、synchronized、native、strictfp -->
<module name="ModifierOrder"/>
<!-- 檢查接口和annotation中是否有多餘修飾符,如接口方法不必使用public -->
<module name="RedundantModifier"/>
<!-- Modifier 修飾符檢查 -->
<!-- Naming Conventions 命名規範 -->
<module name="MethodName">
<property name="format" value="^[a-z][a-z0-9][a-zA-Z0-9_]*$"/>
<message key="name.invalidPattern"
value="Method name ''{0}'' must match pattern ''{1}''."/>
</module>
<module name="PackageName">
<property name="format" value="^[a-z]+(\.[a-z][a-z0-9]*)*$"/>
<message key="name.invalidPattern"
value="Package name ''{0}'' must match pattern ''{1}''."/>
</module>
<module name="TypeName">
<property name="tokens" value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, ANNOTATION_DEF"/>
<message key="name.invalidPattern"
value="Type name ''{0}'' must match pattern ''{1}''."/>
</module>
<module name="MemberName">
<property name="format" value="^[a-z][a-z0-9][a-zA-Z0-9]*$"/>
<message key="name.invalidPattern"
value="Member name ''{0}'' must match pattern ''{1}''."/>
</module>
<module name="ParameterName">
<property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$"/>
<message key="name.invalidPattern"
value="Parameter name ''{0}'' must match pattern ''{1}''."/>
</module>
<module name="CatchParameterName">
<property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$"/>
<message key="name.invalidPattern"
value="Catch parameter name ''{0}'' must match pattern ''{1}''."/>
</module>
<module name="LocalVariableName">
<property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$"/>
<message key="name.invalidPattern"
value="Local variable name ''{0}'' must match pattern ''{1}''."/>
</module>
<module name="ClassTypeParameterName">
<property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)"/>
<message key="name.invalidPattern"
value="Class type name ''{0}'' must match pattern ''{1}''."/>
</module>
<module name="MethodTypeParameterName">
<property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)"/>
<message key="name.invalidPattern"
value="Method type name ''{0}'' must match pattern ''{1}''."/>
</module>
<module name="InterfaceTypeParameterName">
<property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)"/>
<message key="name.invalidPattern"
value="Interface type name ''{0}'' must match pattern ''{1}''."/>
</module>
<!-- Naming Conventions 命名規範 -->
<!-- Regexp 正則規範 -->
<!-- 禁止使用System.out.println -->
<module name="Regexp">
<property name="format" value="System\.out\.println"/>
<property name="illegalPattern" value="true"/>
</module>
<!-- 文件開頭公司聲明信息 -->
<module name="Regexp">
</module>
<!-- Regexp 正則規範 -->
<!-- whitespace 空格規範 -->
<module name="EmptyLineSeparator">
<property name="tokens"
value="PACKAGE_DEF, IMPORT, STATIC_IMPORT, CLASS_DEF, INTERFACE_DEF, ENUM_DEF,
STATIC_INIT, INSTANCE_INIT, METHOD_DEF, CTOR_DEF, VARIABLE_DEF"/>
<property name="allowNoEmptyLineBetweenFields" value="true"/>
</module>
<module name="GenericWhitespace"/>
<!-- 方法名後跟左圓括號"(" -->
<module name="MethodParamPad"/>
<!-- 檢查在某個特定關鍵字之後應保留空格 -->
<module name="NoWhitespaceAfter"/>
<!-- 檢查在某個特定關鍵字之前應保留空格 -->
<module name="NoWhitespaceBefore"/>
<!-- 操作符換行策略檢查 -->
<module name="OperatorWrap"/>
<!-- 檢查分隔符是否在空白之後 -->
<module name="ParenPad"/>
<!-- 在類型轉換時,不允許左圓括號右邊有空格,也不允許與右圓括號左邊有空格 -->
<module name="TypecastParenPad"/>
<!-- 檢查分隔符是否在空白之後 -->
<module name="WhitespaceAfter"/>
<!-- 檢查分隔符周圍是否有空白 -->
<module name="WhitespaceAround"/>
<!-- 不換行 -->
<module name="NoLineWrap">
<property name="tokens" value="PACKAGE_DEF, IMPORT"/>
</module>
<!-- whitespace 空格規範 -->
</module>
</module>