技術總監來巡查,剛巧前段時間遇到了一個問題還沒解決,就拉着大牛開問。結果,問題是解決了,還附帶了另一個問題,或是要求出來,沒啥技術含量,但是很麻煩的一個東西:代碼格式。
之前我寫代碼,因為屏幕比較小,所以就盡量一行寫的不寫兩行,每一行都是一個邏輯片段,后期審閱時超級方便,但“這只是我自己的習慣而已”,可我覺着這么寫,超級爽啊!但是,但是,但是,技術總監嚴厲要求,要按照公司自己的一套標准來寫。
后來我自己也想了下,我這么寫的原因是,自己開發的筆記本的屏幕比較小,代碼看不全所以才這么來的,可是,別人,特別是后期的運維人員在進行操作時,他們的機器情況跟我的完全不一樣啊,萬一他們的是90英寸超級大屏呢?想象一下,我的代碼就漂浮在屏幕的最上邊,想一條蟲子,難看至極。
哎,好吧,咱哥們還是按照公司的要求來吧,萬一這個項目的接盤俠是個武力至上的人,那就等着被提刀滿街追了。
廢話說了好多,就是心里不爽吐吐槽,現在,把一套checkstyle標准貼出來,以備后來裝逼用。
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE module PUBLIC "-//Puppy Crawl//DTD Check Configuration 1.3//EN" 3 "http://www.puppycrawl.com/dtds/configuration_1_3.dtd"> 4 5 <module name="Checker"> 6 <property name="severity" value="warning"/> 7 <module name="TreeWalker"> 8 <module name="JavadocMethod"> 9 <property name="severity" value="ignore"/> 10 <property name="suppressLoadErrors" value="true"/> 11 <metadata name="net.sf.eclipsecs.core.lastEnabledSeverity" value="inherit"/> 12 </module> 13 <module name="JavadocType"> 14 <property name="severity" value="ignore"/> 15 <metadata name="net.sf.eclipsecs.core.lastEnabledSeverity" value="inherit"/> 16 </module> 17 <module name="JavadocVariable"> 18 <property name="severity" value="ignore"/> 19 <metadata name="net.sf.eclipsecs.core.lastEnabledSeverity" value="inherit"/> 20 </module> 21 <module name="ConstantName"> 22 <property name="applyToPrivate" value="false"/> 23 </module> 24 <module name="LocalFinalVariableName"/> 25 <module name="LocalVariableName"/> 26 <module name="MemberName"/> 27 <module name="MethodName"/> 28 <module name="PackageName"/> 29 <module name="ParameterName"/> 30 <module name="StaticVariableName"/> 31 <module name="TypeName"/> 32 <module name="AvoidStarImport"/> 33 <module name="IllegalImport"/> 34 <module name="RedundantImport"/> 35 <module name="UnusedImports"/> 36 <module name="MethodLength"/> 37 <module name="ParameterNumber"/> 38 <module name="LineLength"> 39 <property name="max" value="160"/> 40 <property name="tabWidth" value="4"/> 41 </module> 42 <module name="EmptyForIteratorPad"/> 43 <module name="MethodParamPad"/> 44 <module name="NoWhitespaceAfter"/> 45 <module name="NoWhitespaceBefore"/> 46 <module name="OperatorWrap"/> 47 <module name="ParenPad"/> 48 <module name="TypecastParenPad"/> 49 <module name="WhitespaceAfter"/> 50 <module name="WhitespaceAround"> 51 <property name="tokens" 52 value="BAND,BAND_ASSIGN,BOR,BOR_ASSIGN,BSR,BSR_ASSIGN,BXOR,BXOR_ASSIGN,COLON,DIV,DIV_ASSIGN,EQUAL,GE,GT,LAND,LCURLY,LE,LITERAL_ASSERT,LITERAL_CATCH,LITERAL_DO,LITERAL_ELSE,LITERAL_FINALLY,LITERAL_FOR,LITERAL_IF,LITERAL_RETURN,LITERAL_SYNCHRONIZED,LITERAL_TRY,LITERAL_WHILE,LOR,LT,MINUS,MINUS_ASSIGN,MOD,MOD_ASSIGN,NOT_EQUAL,PLUS,PLUS_ASSIGN,QUESTION,RCURLY,SL,SLIST,SL_ASSIGN,SR,SR_ASSIGN,STAR,STAR_ASSIGN,LITERAL_ASSERT,TYPE_EXTENSION_AND,WILDCARD_TYPE"/> 53 </module> 54 <module name="ModifierOrder"/> 55 <module name="RedundantModifier"/> 56 <module name="AvoidNestedBlocks"/> 57 <module name="EmptyBlock"/> 58 <module name="LeftCurly"/> 59 <module name="NeedBraces"/> 60 <module name="RightCurly"/> 61 <module name="AvoidInlineConditionals"/> 62 <module name="EmptyStatement"/> 63 <module name="EqualsHashCode"/> 64 <module name="HiddenField"> 65 <property name="ignoreConstructorParameter" value="true"/> 66 <property name="ignoreSetter" value="true"/> 67 </module> 68 <module name="IllegalInstantiation"> 69 <property name="classes" value="java.lang.Boolean"/> 70 </module> 71 <module name="InnerAssignment"/> 72 <module name="MissingSwitchDefault"/> 73 <module name="RedundantThrows"> 74 <property name="severity" value="ignore"/> 75 <property name="suppressLoadErrors" value="true"/> 76 <metadata name="net.sf.eclipsecs.core.lastEnabledSeverity" value="inherit"/> 77 </module> 78 <module name="SimplifyBooleanExpression"/> 79 <module name="SimplifyBooleanReturn"/> 80 <module name="FinalClass"/> 81 <module name="HideUtilityClassConstructor"/> 82 <module name="InterfaceIsType"/> 83 <module name="VisibilityModifier"/> 84 <module name="ArrayTypeStyle"/> 85 <module name="TodoComment"/> 86 <module name="UpperEll"/> 87 <module name="OperatorWrap"/> 88 </module> 89 <module name="JavadocPackage"> 90 <property name="severity" value="ignore"/> 91 <metadata name="net.sf.eclipsecs.core.lastEnabledSeverity" value="inherit"/> 92 </module> 93 <module name="NewlineAtEndOfFile"/> 94 <module name="Translation"/> 95 <module name="FileLength"/> 96 <module name="FileTabCharacter"> 97 <property name="severity" value="ignore"/> 98 <metadata name="net.sf.eclipsecs.core.lastEnabledSeverity" value="inherit"/> 99 </module> 100 <module name="RegexpSingleline"> 101 <property name="format" value="\s+$"/> 102 <property name="message" value="Line has trailing spaces."/> 103 </module> 104 </module>
具體的代碼含義懶得分析了,直接拿來用就ok了。
附上用法:
Eclipse 或者 IntelliJ IDEA 等 IDE 中有對應的 Plugin。可搜索相應的 Plugin Market 安裝。
以 IntelliJ IDEA 為例。
菜單選擇 File>Setting,Plugins 選項卡中搜索 checkstyle 與 findbugs 進行安裝。安裝可能需要翻牆,可也去IDEA官網的插件頁面里去下載,然后手動添加到IDEA中去。
菜單選擇 File>Setting, Other Settings 中,會有安裝后的Plugin的選項。
CheckStyle 選項中新增 Configuration File, 選擇 "Use a local CheckStyle file", File: 中選擇本項目中的 checkstyle.xml 文件,Description 隨意命名,比如 "Vastio Java Style"。
將新增加的 Configuration File 設為 Active。
最后,確認一下 Setting 中的 Editor:Inspections:CheckStyle 中的 Real-time scan 是打開的。
PS : 阿里巴巴要搞事情了額,他們出了個JAVA開發規范手冊,里面一大堆的規定,so,為了懶得查閱書籍,寫個checkstyle來自動檢測代碼吧:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE module PUBLIC "-//Puppy Crawl//DTD Check Configuration 1.3//EN" 3 "http://www.puppycrawl.com/dtds/configuration_1_3.dtd"> 4 5 <module name="Checker"> 6 7 <!-- 檢查文件是否以一個空行結束 --> 8 <module name="NewlineAtEndOfFile"/> 9 10 <!-- 文件長度不超過1500行 --> 11 <module name="FileLength"> 12 <property name="max" value="1500"/> 13 </module> 14 15 <!-- 每個java文件一個語法樹 --> 16 <module name="TreeWalker"> 17 <!-- import檢查--> 18 <!-- 檢查是否從非法的包中導入了類 --> 19 <module name="IllegalImport"/> 20 <!-- 檢查是否導入了多余的包 --> 21 <module name="RedundantImport"/> 22 <!-- 沒用的import檢查,比如:1.沒有被用到2.重復的3.import java.lang的4.import 與該類在同一個package的 --> 23 <module name="UnusedImports"/> 24 25 <!-- 注釋檢查 --> 26 <!-- 檢查構造函數的javadoc --> 27 <module name="JavadocType"> 28 <property name="allowUnknownTags" value="true"/> 29 <message key="javadoc.missing" value="類注釋:缺少Javadoc注釋。"/> 30 </module> 31 32 <!-- 命名檢查 --> 33 <!-- 局部的final變量,包括catch中的參數的檢查 --> 34 <module name="LocalFinalVariableName"/> 35 <!-- 局部的非final型的變量,包括catch中的參數的檢查 --> 36 <module name="LocalVariableName"/> 37 <!-- 包名的檢查(只允許小寫字母),默認^[a-z]+(\.[a-zA-Z_][a-zA-Z_0-9_]*)*$ --> 38 <module name="PackageName"> 39 <property name="format" value="^[a-z]+(\.[a-z][a-z0-9]*)*$"/> 40 <message key="name.invalidPattern" value="包名 ''{0}'' 要符合 ''{1}''格式."/> 41 </module> 42 <!-- 僅僅是static型的變量(不包括static final型)的檢查 --> 43 <module name="StaticVariableName"/> 44 <!-- Class或Interface名檢查,默認^[A-Z][a-zA-Z0-9]*$--> 45 <module name="TypeName"> 46 <property name="severity" value="warning"/> 47 <message key="name.invalidPattern" value="名稱 ''{0}'' 要符合 ''{1}''格式."/> 48 </module> 49 <!-- 非static型變量的檢查 --> 50 <module name="MemberName"/> 51 <!-- 方法名的檢查 --> 52 <module name="MethodName"/> 53 <!-- 方法的參數名 --> 54 <module name="ParameterName "/> 55 <!-- 常量名的檢查(只允許大寫),默認^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$ --> 56 <module name="ConstantName"/> 57 58 <!-- 定義檢查 --> 59 <!-- 檢查數組類型定義的樣式 --> 60 <module name="ArrayTypeStyle"/> 61 <!-- 檢查long型定義是否有大寫的“L” --> 62 <module name="UpperEll"/> 63 64 <!-- 長度檢查 --> 65 <!-- 每行不超過140個字符 --> 66 <module name="LineLength"> 67 <property name="max" value="140"/> 68 </module> 69 <!-- 方法不超過50行 --> 70 <module name="MethodLength"> 71 <property name="tokens" value="METHOD_DEF"/> 72 <property name="max" value="50"/> 73 </module> 74 <!-- 方法的參數個數不超過5個。 並且不對構造方法進行檢查--> 75 <module name="ParameterNumber"> 76 <property name="max" value="5"/> 77 <property name="ignoreOverriddenMethods" value="true"/> 78 <property name="tokens" value="METHOD_DEF"/> 79 </module> 80 81 <!-- 空格檢查--> 82 <!-- 方法名后跟左圓括號"(" --> 83 <module name="MethodParamPad"/> 84 <!-- 在類型轉換時,不允許左圓括號右邊有空格,也不允許與右圓括號左邊有空格 --> 85 <module name="TypecastParenPad"/> 86 <!-- 檢查在某個特定關鍵字之后應保留空格 --> 87 <module name="NoWhitespaceAfter"/> 88 <!-- 檢查在某個特定關鍵字之前應保留空格 --> 89 <module name="NoWhitespaceBefore"/> 90 <!-- 操作符換行策略檢查 --> 91 <module name="OperatorWrap"/> 92 <!-- 圓括號空白 --> 93 <module name="ParenPad"/> 94 <!-- 檢查分隔符是否在空白之后 --> 95 <module name="WhitespaceAfter"/> 96 <!-- 檢查分隔符周圍是否有空白 --> 97 <module name="WhitespaceAround"/> 98 99 <!-- 修飾符檢查 --> 100 <!-- 檢查修飾符的順序是否遵照java語言規范,默認public、protected、private、abstract、static、final、transient、volatile、synchronized、native、strictfp --> 101 <module name="ModifierOrder"/> 102 <!-- 檢查接口和annotation中是否有多余修飾符,如接口方法不必使用public --> 103 <module name="RedundantModifier"/> 104 105 <!-- 代碼塊檢查 --> 106 <!-- 檢查是否有嵌套代碼塊 --> 107 <module name="AvoidNestedBlocks"/> 108 <!-- 檢查是否有空代碼塊 --> 109 <module name="EmptyBlock"/> 110 <!-- 檢查左大括號位置 --> 111 <module name="LeftCurly"/> 112 <!-- 檢查代碼塊是否缺失{} --> 113 <module name="NeedBraces"/> 114 <!-- 檢查右大括號位置 --> 115 <module name="RightCurly"/> 116 117 <!-- 代碼檢查 --> 118 <!-- 檢查空的代碼段 --> 119 <module name="EmptyStatement"/> 120 <!-- 檢查在重寫了equals方法后是否重寫了hashCode方法 --> 121 <module name="EqualsHashCode"/> 122 <!-- 檢查局部變量或參數是否隱藏了類中的變量 --> 123 <module name="HiddenField"> 124 <property name="tokens" value="VARIABLE_DEF"/> 125 </module> 126 <!-- 檢查子表達式中是否有賦值操作 --> 127 <module name="InnerAssignment"/> 128 <!-- 檢查switch語句是否有default --> 129 <module name="MissingSwitchDefault"/> 130 <!-- 檢查是否有過度復雜的布爾表達式 --> 131 <module name="SimplifyBooleanExpression"/> 132 <!-- 檢查是否有過於復雜的布爾返回代碼段 --> 133 <module name="SimplifyBooleanReturn"/> 134 135 <!-- 類設計檢查 --> 136 <!-- 檢查類是否為擴展設計l --> 137 <!-- 檢查只有private構造函數的類是否聲明為final --> 138 <module name="FinalClass"/> 139 <!-- 檢查接口是否僅定義類型 --> 140 <module name="InterfaceIsType"/> 141 <!-- 檢查類成員的可見度 檢查類成員的可見性。只有static final 成員是public的 142 除非在本檢查的protectedAllowed和packagedAllowed屬性中進行了設置--> 143 <module name="VisibilityModifier"> 144 <property name="packageAllowed" value="true"/> 145 <property name="protectedAllowed" value="true"/> 146 </module> 147 148 <!-- 語法 --> 149 <!-- String的比較不能用!= 和 == --> 150 <module name="StringLiteralEquality"/> 151 <!-- 限制for循環最多嵌套2層 --> 152 <module name="NestedForDepth"> 153 <property name="max" value="2"/> 154 </module> 155 <!-- if最多嵌套3層 --> 156 <module name="NestedIfDepth"> 157 <property name="max" value="3"/> 158 </module> 159 <!-- 檢查未被注釋的main方法,排除以Appllication結尾命名的類 --> 160 <module name="UncommentedMain"> 161 <property name="excludedClasses" value=".*[Application,Test]$"/> 162 </module> 163 <!-- 禁止使用System.out.println --> 164 <module name="Regexp"> 165 <property name="format" value="System\.out\.println"/> 166 <property name="illegalPattern" value="true"/> 167 </module> 168 <!-- return個數 3個--> 169 <module name="ReturnCount"> 170 <property name="max" value="3"/> 171 </module> 172 <!--try catch 異常處理數量 3--> 173 <module name="NestedTryDepth "> 174 <property name="max" value="3"/> 175 </module> 176 <!-- clone方法必須調用了super.clone() --> 177 <module name="SuperClone"/> 178 <!-- finalize 必須調用了super.finalize() --> 179 <module name="SuperFinalize"/> 180 181 </module> 182 </module>
使用方法跟上一個checks一樣,丟到IDEA里面就行了,懶省事。
PPS:阿里大法好,但我覺着谷歌大法更好:
1 <?xml version="1.0"?> 2 <!DOCTYPE module PUBLIC 3 "-//Puppy Crawl//DTD Check Configuration 1.3//EN" 4 "http://www.puppycrawl.com/dtds/configuration_1_3.dtd"> 5 6 <!-- 7 Checkstyle configuration that checks the Google coding conventions from Google Java Style 8 that can be found at https://google.github.io/styleguide/javaguide.html. 9 Checkstyle is very configurable. Be sure to read the documentation at 10 http://checkstyle.sf.net (or in your downloaded distribution). 11 To completely disable a check, just comment it out or delete it from the file. 12 Authors: Max Vetrenko, Ruslan Diachenko, Roman Ivanov. 13 --> 14 15 <module name="Checker"> 16 <property name="charset" value="UTF-8"/> 17 18 <property name="severity" value="warning"/> 19 20 <!--<property name="fileExtensions" value="java, properties, xml"/>--> 21 <!-- Checks for whitespace --> 22 <!-- See http://checkstyle.sf.net/config_whitespace.html --> 23 <module name="FileTabCharacter"> 24 <property name="eachLine" value="true"/> 25 </module> 26 27 <module name="TreeWalker"> 28 <module name="OuterTypeFilename"/> 29 <module name="IllegalTokenText"> 30 <property name="tokens" value="STRING_LITERAL, CHAR_LITERAL"/> 31 <property name="format" 32 value="\\u00(08|09|0(a|A)|0(c|C)|0(d|D)|22|27|5(C|c))|\\(0(10|11|12|14|15|42|47)|134)"/> 33 <property name="message" value="Avoid using corresponding octal or Unicode escape."/> 34 </module> 35 <module name="AvoidEscapedUnicodeCharacters"> 36 <property name="allowEscapesForControlCharacters" value="true"/> 37 <property name="allowByTailComment" value="true"/> 38 <property name="allowNonPrintableEscapes" value="true"/> 39 </module> 40 <!--單行最大長度,google100,修改--> 41 <module name="LineLength"> 42 <property name="max" value="200"/> 43 <property name="ignorePattern" 44 value="^package.*|^import.*|a href|href|http://|https://|ftp://"/> 45 </module> 46 <module name="AvoidStarImport"/><!--import要指明到類 不能包含*--> 47 <module name="OneTopLevelClass"/> 48 <module name="NoLineWrap"/> 49 <module name="EmptyBlock"> 50 <property name="option" value="TEXT"/> 51 <property name="tokens" 52 value="LITERAL_TRY, LITERAL_FINALLY, LITERAL_IF, LITERAL_ELSE, LITERAL_SWITCH,LITERAL_WHILE,LITERAL_FOR,LITERAL_CASE"/> 53 </module> 54 <module name="NeedBraces"/> 55 <!--option: 定義左大括號'{'顯示位置,eol在同一行顯示,nl在下一行顯示 56 maxLineLength: 大括號'{'所在行行最多容納的字符數 57 tokens: 該屬性適用的類型,例:CLASS_DEF,INTERFACE_DEF,METHOD_DEF,CTOR_DEF --> 58 <module name="LeftCurly"> 59 <property name="maxLineLength" value="100"/> 60 </module> 61 62 <module name="RightCurly"/> 63 <module name="RightCurly"> 64 <property name="option" value="alone"/> 65 <property name="tokens" 66 value="CLASS_DEF, METHOD_DEF, CTOR_DEF, LITERAL_FOR, LITERAL_WHILE, LITERAL_DO, STATIC_INIT, INSTANCE_INIT"/> 67 </module> 68 <!--檢查空格 方法體前括號,比較操作符兩邊空格等--> 69 <module name="WhitespaceAround"> 70 <property name="allowEmptyConstructors" value="true"/> 71 <property name="allowEmptyMethods" value="true"/> 72 <property name="allowEmptyTypes" value="true"/> 73 <property name="allowEmptyLoops" value="true"/> 74 <message key="ws.notFollowed" 75 value="WhitespaceAround: ''{0}'' is not followed by whitespace. Empty blocks may only be represented as '{}' when not part of a multi-block statement (4.1.3)"/> 76 <message key="ws.notPreceded" 77 value="WhitespaceAround: ''{0}'' is not preceded with whitespace."/> 78 </module> 79 <module name="OneStatementPerLine"/> 80 <!--一行聲明一個變量--> 81 <module name="MultipleVariableDeclarations"/> 82 <module name="ArrayTypeStyle"/> 83 <!--default clause--> 84 <module name="MissingSwitchDefault"/> 85 <!--case break--> 86 <module name="FallThrough"/> 87 <!--Long型常量后綴--> 88 <module name="UpperEll"/> 89 <module name="ModifierOrder"/> 90 <!--空行規則--> 91 <module name="EmptyLineSeparator"> 92 <property name="allowNoEmptyLineBetweenFields" value="true"/> 93 </module> 94 <module name="SeparatorWrap"> 95 <property name="tokens" value="DOT"/> 96 <property name="option" value="nl"/> 97 </module> 98 <module name="SeparatorWrap"> 99 <property name="tokens" value="COMMA"/> 100 <property name="option" value="EOL"/> 101 </module> 102 <module name="PackageName"> 103 <property name="format" value="^[a-z]+(\.[a-z][a-z0-9]*)*$"/> 104 <message key="name.invalidPattern" 105 value="Package name ''{0}'' must match pattern ''{1}''."/> 106 </module> 107 <module name="TypeName"> 108 <message key="name.invalidPattern" 109 value="Type name ''{0}'' must match pattern ''{1}''."/> 110 </module> 111 <!--成員變量命名規則--><!--修改--> 112 <module name="MemberName"> 113 <property name="format" value="^m[A-Z][a-zA-Z0-9]*$"/> 114 <message key="name.invalidPattern" 115 value="Member name ''{0}'' must match pattern ''{1}''."/> 116 </module> 117 <!--參數命名規則--><!--修改--> 118 <module name="ParameterName"> 119 <property name="format" value="^[a-z][a-zA-Z0-9]*$"/> 120 <message key="name.invalidPattern" 121 value="Parameter name ''{0}'' must match pattern ''{1}''."/> 122 </module> 123 <!--unused start--> 124 <!--<module name="CatchParameterName">--> 125 <!--<property name="format" value="^[a-z][a-z0-9][a-zA-Z0-9]*$"/>--> 126 <!--<message key="name.invalidPattern"--> 127 <!--value="Catch parameter name ''{0}'' must match pattern ''{1}''."/>--> 128 <!--</module>--> 129 <!--unused end--> 130 <module name="LocalVariableName"> 131 <property name="tokens" value="VARIABLE_DEF"/> 132 <property name="format" value="^[a-z][a-zA-Z0-9]*$"/> 133 <property name="allowOneCharVarInForLoop" value="true"/> 134 <message key="name.invalidPattern" 135 value="Local variable name ''{0}'' must match pattern ''{1}''."/> 136 </module> 137 <module name="ClassTypeParameterName"> 138 <property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)"/> 139 <message key="name.invalidPattern" 140 value="Class type name ''{0}'' must match pattern ''{1}''."/> 141 </module> 142 <module name="MethodTypeParameterName"> 143 <property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)"/> 144 <message key="name.invalidPattern" 145 value="Method type name ''{0}'' must match pattern ''{1}''."/> 146 </module> 147 <module name="InterfaceTypeParameterName"> 148 <property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)"/> 149 <message key="name.invalidPattern" 150 value="Interface type name ''{0}'' must match pattern ''{1}''."/> 151 </module> 152 <!--不能定義finalize方法--> 153 <module name="NoFinalizer"/> 154 <!--泛型表示中的空格規則--> 155 <module name="GenericWhitespace"> 156 <message key="ws.followed" 157 value="GenericWhitespace ''{0}'' is followed by whitespace."/> 158 <message key="ws.preceded" 159 value="GenericWhitespace ''{0}'' is preceded with whitespace."/> 160 <message key="ws.illegalFollow" 161 value="GenericWhitespace ''{0}'' should followed by whitespace."/> 162 <message key="ws.notPreceded" 163 value="GenericWhitespace ''{0}'' is not preceded with whitespace."/> 164 </module> 165 <!--縮進規則--> 166 <module name="Indentation"> 167 <property name="basicOffset" value="4"/> 168 <property name="braceAdjustment" value="0"/> 169 <property name="caseIndent" value="4"/> 170 <property name="throwsIndent" value="4"/> 171 <property name="arrayInitIndent" value="4"/> 172 <property name="lineWrappingIndentation" value="4"/> 173 </module> 174 <!--名稱中縮寫,駝峰規則--> 175 <module name="AbbreviationAsWordInName"> 176 <property name="ignoreFinal" value="false"/> 177 <property name="allowedAbbreviationLength" value="1"/> 178 </module> 179 <!--重載方法不能被其他方法間隔開--> 180 <module name="OverloadMethodsDeclarationOrder"/> 181 <!--局部變量聲明與使用的間隔,默認3行--> 182 <module name="VariableDeclarationUsageDistance"/> 183 <!--import規則與android studio IDE 不一致,采用IDE規則--> 184 <!--<module name="CustomImportOrder">--> 185 <!--<property name="specialImportsRegExp" value="com.google"/>--> 186 <!--<property name="sortImportsInGroupAlphabetically" value="true"/>--> 187 <!--<property name="customImportOrderRules"--> 188 <!--value="STATIC###SPECIAL_IMPORTS###THIRD_PARTY_PACKAGE###STANDARD_JAVA_PACKAGE"/>--> 189 <!--</module>--> 190 <module name="MethodParamPad"/> 191 <module name="OperatorWrap"> 192 <property name="option" value="NL"/> 193 <property name="tokens" 194 value="BAND, BOR, BSR, BXOR, DIV, EQUAL, GE, GT, LAND, LE, LITERAL_INSTANCEOF, LOR, LT, MINUS, MOD, NOT_EQUAL, PLUS, QUESTION, SL, SR, STAR "/> 195 </module> 196 <module name="AnnotationLocation"> 197 <property name="tokens" 198 value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, METHOD_DEF, CTOR_DEF"/> 199 </module> 200 <module name="AnnotationLocation"> 201 <property name="tokens" value="VARIABLE_DEF"/> 202 <property name="allowSamelineMultipleAnnotations" value="true"/> 203 </module> 204 <!--@注釋 @param, @return, @throws, @deprecated --> 205 <module name="NonEmptyAtclauseDescription"/> 206 <module name="JavadocTagContinuationIndentation"/> 207 <!--unused start--> 208 <!--注釋文檔規則,@return 不能包含的文字,第一句注釋結尾標點--> 209 <!--<module name="SummaryJavadoc">--> 210 <!--<property name="forbiddenSummaryFragments"--> 211 <!--value="^@return the *|^This method returns |^A [{]@code [a-zA-Z0-9]+[}]( is a )"/>--> 212 <!--</module>--> 213 <!--unused end--> 214 <module name="JavadocParagraph"/> 215 <module name="AtclauseOrder"> 216 <property name="tagOrder" value="@param, @return, @throws, @deprecated"/> 217 <property name="target" 218 value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, METHOD_DEF, CTOR_DEF, VARIABLE_DEF"/> 219 </module> 220 <!--方法注釋 修改 可以不添加方法注釋--> 221 <module name="JavadocMethod"> 222 <property name="scope" value="public"/> 223 <property name="allowMissingParamTags" value="true"/> 224 <property name="allowMissingThrowsTags" value="true"/> 225 <property name="allowMissingReturnTag" value="true"/> 226 <property name="minLineCount" value="2"/> 227 <property name="allowedAnnotations" value="Override, Test"/> 228 <property name="allowThrowsTagsForSubclasses" value="true"/> 229 <property name="allowMissingJavadoc" value="true" /> 230 </module> 231 <module name="MethodName"> 232 <property name="format" value="^[a-z][a-z0-9][a-zA-Z0-9_]*$"/> 233 <message key="name.invalidPattern" 234 value="Method name ''{0}'' must match pattern ''{1}''."/> 235 </module> 236 <!--these unused start--> 237 <!--<module name="SingleLineJavadoc">--> 238 <!--<property name="ignoreInlineTags" value="false"/>--> 239 <!--</module>--> 240 <!--<module name="EmptyCatchBlock">--> 241 <!--<property name="exceptionVariableName" value="expected"/>--> 242 <!--</module>--> 243 <!--<module name="CommentsIndentation"/>--> 244 <!--these unused end--> 245 <!--嵌套深度--> 246 <module name="NestedForDepth"/> 247 <module name="NestedTryDepth"/> 248 <module name="NestedIfDepth"> 249 <property name="max" value="3"/> 250 </module> 251 <!--<module name="MethodLength">--> 252 <!--<property name="max" value="20"/>--> 253 <!--<property name="countEmpty" value="false"/>--> 254 <!--</module>--> 255 <module name="SimplifyBooleanExpression"/> 256 <module name="StaticVariableName" > 257 <property name="format" value="^s[A-Z][a-zA-Z0-9]*$"/> 258 </module> 259 <!--<module name="TodoComment"/>--> 260 </module> 261 </module>
