2015年01月01日開通了博客園個人博客功能,承接着2014的忙碌,到今天稍微鬆緩一些,第一篇博文就把我今天最新更新的MyEclipse2014集成PMD代碼檢測插件自定義規則配置文件JAVA版發佈出來吧,方便本身之後回顧的同時,也看看能不能幫到有這方面需求的小夥伴們。css
不要問我PMD是什麼?請GOOGLE之或者無視之。文件名:cplatform_pmd5.2.3_rules.xmljava
1 <?xml version="1.0" encoding="UTF-8"?> 2 <ruleset name="Favorites" 3 xmlns="http://pmd.sf.net/ruleset/1.0.0" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd" 6 xsi:noNamespaceSchemaLocation="http://pmd.sf.net/ruleset_xml_schema.xsd"> 7 8 <description> 9 做 者:ZONDA 10 對應 PMD:V5.2.3 11 規則版本:V1.1(2015-01-13) 12 推薦指數:三、四、5級的規則 13 修改規則:EmptyCatchBlock、EmptyIfStmt、EmptyWhileStmt、EmptyTryBlock、EmptyFinallyBlock、EmptySwitchStatements、EmptySynchronizedBlock、 14 EmptyStaticInitializer、EmptyStatementNotInLoop等規則轉移到rulesets/java/empty.xml中 15 UnnecessaryFinalModifier、UselessOperationOnImmutable等規則轉移到rulesets/java/unnecessary.xml中 16 增長規則: 17 移除規則:UseSingleton 18 19 20 做 者:ZONDA 21 對應 PMD:V4.2.6 22 規則版本:V1.0(2014-11-17) 23 推薦指數:三、四、5級的規則 24 修改規則: 25 增長規則: 26 移除規則: 27 </description> 28 29 30 <!--====================Basic Rules begin(共33個)======================--> 31 <!--不容許出現空的catch塊,避免屏蔽異常,不處理或不報告異常。(FindBugs不檢查)--> 32 <rule ref="rulesets/java/empty.xml/EmptyCatchBlock"> 33 <properties> 34 <property name="allowCommentedBlocks" value="false"/> 35 </properties> 36 </rule> 37 <!--不容許有空if語句塊(或空else塊)。(FindBugs不檢查)--> 38 <rule ref="rulesets/java/empty.xml/EmptyIfStmt"/> 39 <!--不容許有空while循環塊。注意:不包括do循環。(FindBugs不檢查)--> 40 <rule ref="rulesets/java/empty.xml/EmptyWhileStmt"/> 41 <!--不容許有空try塊。(FindBugs不檢查)--> 42 <rule ref="rulesets/java/empty.xml/EmptyTryBlock"/> 43 <!--不容許有空finally塊。(FindBugs不檢查)--> 44 <rule ref="rulesets/java/empty.xml/EmptyFinallyBlock"/> 45 <!--不容許有空switch塊。與這個規則重複:rulesets/java/design.xml/SwitchStmtsShouldHaveDefault、MissingBreakInSwitch。(FindBugs不檢查)--> 46 <rule ref="rulesets/java/empty.xml/EmptySwitchStatements"/> 47 <!--避免混亂的循環變量賦值(避免在內循環裏修改外循環變量)。與這個規則有點重複:rulesets/java/controversial.xml/DataflowAnomalyAnalysis。(FindBugs不檢查)--> 48 <rule ref="rulesets/java/basic.xml/JumbledIncrementer"/> 49 <!--簡單的for循環能夠用while循環取代。(FindBugs不檢查,注,FindBugs能發現死循環)--> 50 <!--rule ref="rulesets/java/basic.xml/ForLoopShouldBeWhileLoop"/--> 51 <!--當基本型數據轉換成String時,避免沒必要要的臨時對象。(FindBugs檢查)--> 52 <!--rule ref="rulesets/java/basic.xml/UnnecessaryConversionTemporary"/--> 53 <!--equals和hashcode同時定義。(FindBugs檢查)--> 54 <rule ref="rulesets/java/basic.xml/OverrideBothEqualsAndHashcode"/> 55 <!--doublecheck問題。(FindBugs檢查)--> 56 <!--rule ref="rulesets/java/basic.xml/DoubleCheckedLocking"/--> 57 <!--禁止在finally塊裏return,避免屏蔽異常。(FindBugs不檢查)--> 58 <rule ref="rulesets/java/basic.xml/ReturnFromFinallyBlock"/> 59 <!--避免空的同步塊。(FindBugs檢查)--> 60 <rule ref="rulesets/java/empty.xml/EmptySynchronizedBlock"/> 61 <!--方法返回值void,避免沒必要要的return。(FindBugs不檢查)--> 62 <!--rule ref="rulesets/java/basic.xml/UnnecessaryReturn"/--> 63 <!--空的static初始化。(FindBugs不檢查)--> 64 <rule ref="rulesets/java/empty.xml/EmptyStaticInitializer"/> 65 <!--if語句的條件始終是true或false。(FindBugs不檢查)--> 66 <rule ref="rulesets/java/basic.xml/UnconditionalIfStatement"/> 67 <!--出現了空語句(就一個分號),若是在循環裏則能夠。(FindBugs不檢查)--> 68 <rule ref="rulesets/java/empty.xml/EmptyStatementNotInLoop"/> 69 <!--避免實例化Boolean對象,而應用常量Boolean.TRUE, Boolean.FALSE。(FindBugs只檢查構造方法生成對象的狀況,不檢查valueOf)--> 70 <rule ref="rulesets/java/basic.xml/BooleanInstantiation"/> 71 <!--當一個類定義成final後,它全部的方法自動final。(FindBugs不檢查)--> 72 <rule ref="rulesets/java/unnecessary.xml/UnnecessaryFinalModifier"/> 73 <!--內嵌的if語句可以和外層的if語句合併成一個if語句。(FindBugs不檢查)--> 74 <!--rule ref="rulesets/java/basic.xml/CollapsibleIfStatements"/--> 75 <!--被覆蓋的方法僅僅調用了基類的方法。(FindBugs檢查)--> 76 <!--rule ref="rulesets/java/basic.xml/UselessOverridingMethod"/--> 77 <!--Collection.toArray調用轉換成數組,應主動傳一個明確類型的數組對象,不然運行時會拋ClassCastException異常。類似規則:rulesets/java/design.xml/OptimizableToArrayCall。(FindBugs不檢查)--> 78 <rule ref="rulesets/java/basic.xml/ClassCastExceptionWithToArray"/> 79 <!--new BigDecimal建議用String參數的構造方法,而不是十進制小數常量(整數除外)。(FindBugs不檢查)--> 80 <rule ref="rulesets/java/basic.xml/AvoidDecimalLiteralsInBigDecimalConstructor"/> 81 <!--不可變對象(如BigDecimal、BigInteger)上的操做結果被忽略。(FindBugs檢查)--> 82 <rule ref="rulesets/java/unnecessary.xml/UselessOperationOnImmutable"/> 83 <!--空指針判斷放錯了位置。要麼以前已報空指針,要麼此處永遠不多是空指針。(FindBugs檢查)--> 84 <rule ref="rulesets/java/basic.xml/MisplacedNullCheck"/> 85 <!--在判斷了對象是不是空指針後,後面緊接着調用該對象的equals方法,而不是將對象做爲另外一個對象的equals參數。(FindBugs不檢查)--> 86 <!--rule ref="rulesets/java/basic.xml/UnusedNullCheckInEquals"/--> 87 <!--不建議用ThreadGroup,由於它的方法不是線程安全的。(FindBugs不檢查)--> 88 <!--rule ref="rulesets/java/basic.xml/AvoidThreadGroup"/--> 89 <!--應該用&&取代||或反之。(FindBugs檢查)--> 90 <rule ref="rulesets/java/basic.xml/BrokenNullCheck"/> 91 <!--不要再建立已經有的對象(BigDecimal.ZERO, BigDecimal.ONE, BigDecimal.TEN)。(FindBugs不檢查)--> 92 <rule ref="rulesets/java/basic.xml/BigIntegerInstantiation"/> 93 <!--避免使用八進制值。(FindBugs不檢查)--> 94 <!--rule ref="rulesets/java/basic.xml/AvoidUsingOctalValues"/--> 95 <!--避免硬編碼IPv4和IPv6,以避免在某些狀況下變的不可能佈署。(FindBugs不檢查)--> 96 <!-- 97 <rule ref="rulesets/java/basic.xml/AvoidUsingHardCodedIP"> 98 <properties> 99 <property name="pattern" value=""/> 100 </properties> 101 </rule> 102 --> 103 <!--對ResultSet的方法(next,previous,first,last)調用結果要進行是不是真的判斷。(FindBugs不檢查)--> 104 <rule ref="rulesets/java/basic.xml/CheckResultSet"/> 105 <!--避免多個一元操做符,要麼是一個錯誤,要麼易引發混淆。(FindBugs不檢查)--> 106 <rule ref="rulesets/java/basic.xml/AvoidMultipleUnaryOperators"/> 107 <!--====================Basic Rules end======================--> 108 109 110 <!--====================braces Rules begin(共4個)======================--> 111 <!--避免使用if語句時不使用大括號--> 112 <rule ref="rulesets/java/braces.xml/IfStmtsMustUseBraces"/> 113 <!--避免使用while循環時不使用大括號--> 114 <rule ref="rulesets/java/braces.xml/WhileLoopsMustUseBraces"/> 115 <!--避免使用if-else語句時不使用大括號--> 116 <rule ref="rulesets/java/braces.xml/IfElseStmtsMustUseBraces"/> 117 <!--避免使用for循環時不使用大括號--> 118 <rule ref="rulesets/java/braces.xml/ForLoopsMustUseBraces"/> 119 <!--====================braces Rules end======================--> 120 121 122 <!--====================clone Rules begin(共3個)======================--> 123 <!--適當的克隆實現:對象的clone()方法中應該包含super.clone()實現--> 124 <rule ref="rulesets/java/clone.xml/ProperCloneImplementation"/> 125 <!--克隆方法要拋出不支持克隆異常:clone()方法應該拋出CloneNotSupportedException--> 126 <rule ref="rulesets/java/clone.xml/CloneThrowsCloneNotSupportedException"/> 127 <!--克隆方法必須實現Cloneable接口:若是類實現Cloneable接口,clone()方法應該被實現爲一個final的方法而且只拋出CloneNotSupportedException的異常--> 128 <rule ref="rulesets/java/clone.xml/CloneMethodMustImplementCloneable"/> 129 <!--====================clone Rules end======================--> 130 131 132 <!--====================codesize Rules begin(共11個)======================--> 133 <!--n條路徑複雜度:NPath複雜度是一個方法中各類可能的執行路徑總和,通常把200做爲考慮下降複雜度的臨界點--> 134 <!-- 135 <rule ref="rulesets/java/codesize.xml/NPathComplexity"> 136 <properties> 137 <property name="minimum" value="200"/> 138 </properties> 139 </rule> 140 --> 141 <!--方法太長:這種違例就是方法中作了太多事,經過建立輔助方法或移除拷貝/粘貼的代碼試着減少方法的規模--> 142 <!-- 143 <rule ref="rulesets/java/codesize.xml/ExcessiveMethodLength"> 144 <properties> 145 <property name="minimum" value="100"/> 146 </properties> 147 </rule> 148 --> 149 <!--太多的參數:過長的參數列表代表應該建立一個新的對象包裝衆多的參數值,就是把參數組織到一塊兒--> 150 <rule ref="rulesets/java/codesize.xml/ExcessiveParameterList"> 151 <properties> 152 <property name="minimum" value="6"/> 153 </properties> 154 </rule> 155 <!--太長的類:太長的類文件代表類試圖作太多的事,試着分解它,減小到易於管理的規模--> 156 <!-- 157 <rule ref="rulesets/java/codesize.xml/ExcessiveClassLength"> 158 <properties> 159 <property name="minimum" value="1000"/> 160 </properties> 161 </rule> 162 --> 163 <!--秩複雜性:由if,while,for,case labels等決策點肯定的複雜度,1-4是低複雜度,5-7爲中,8到10是高複雜度,11以上是很是高--> 164 <!-- 165 <rule ref="rulesets/java/codesize.xml/CyclomaticComplexity"> 166 <properties> 167 <property name="reportLevel" value="10"/> 168 property name="showClassesComplexity" value="true"/> 169 property name="showMethodsComplexity" value="true"/> 170 </properties> 171 </rule> 172 --> 173 <!--過多的公共成員:一個類中若是聲明瞭大量的公共方法和屬性代表類須要分解,由於想徹底測試這個類須要大量的努力--> 174 <!-- 175 <rule ref="rulesets/java/codesize.xml/ExcessivePublicCount"> 176 <properties> 177 <property name="minimum" value="45"/> 178 </properties> 179 </rule> 180 --> 181 <!--太多的域:類包含太多域能夠被從新設計爲包含更少的域,能夠經過將一些信息組織爲嵌套類。好比:一個類包含了city/state/zip域,能夠用一個Address域組織這三個域--> 182 <!-- 183 <rule ref="rulesets/java/codesize.xml/TooManyFields"> 184 <properties> 185 <property name="maxfields" value="15"/> 186 </properties> 187 </rule> 188 --> 189 <!--NCSS方法代碼計算:這個規則採用NCSS(非註釋代碼塊)算法計算給定的方法(不含構造方法)的代碼行數。NCSS忽略代碼中的註釋而且計算實際代碼行數。用這種算法,一行單獨的代碼被計算爲1. (也同時忽略空行)--> 190 <!-- 191 <rule ref="rulesets/java/codesize.xml/NcssMethodCount"> 192 <properties> 193 <property name="minimum" value="100"/> 194 </properties> 195 </rule> 196 --> 197 <!--NCSS類代碼計算:這個規則採用NCSS(非註釋代碼塊)算法計算給定類型的代碼行數。NCSS忽略代碼中的註釋而且計算實際代碼行數。用這種算法,一行單獨的代碼被計算爲1.(也同時忽略空行)--> 198 <!-- 199 <rule ref="rulesets/java/codesize.xml/NcssTypeCount"> 200 <properties> 201 <property name="minimum" value="1500"/> 202 </properties> 203 </rule> 204 --> 205 <!--NCSS構造器代碼計算:這個規則適用NCSS(非註釋代碼塊)算法計算給定的構造方法的代碼行數。NCSS忽略代碼中的註釋而且計算實際代碼行數。用這種算法,一行單獨的代碼被計算爲1.(也同時忽略空行)--> 206 <!-- 207 <rule ref="rulesets/java/codesize.xml/NcssConstructorCount"> 208 <properties> 209 <property name="minimum" value="100"/> 210 </properties> 211 </rule> 212 --> 213 <!--太多的方法:類中包含太多方法可能須要重構,以減低複雜度和獲取更加細粒度的對象--> 214 <!-- 215 <rule ref="rulesets/java/codesize.xml/TooManyMethods"> 216 <properties> 217 <property name="maxmethods" value="20"/> 218 </properties> 219 </rule> 220 --> 221 <!--====================codesize Rules end===============================--> 222 223 224 <!--==============controversial Rules begin(共19個)====================--> 225 <!--非必要的構造器:本規則檢查沒必要要的構造器,例如:只存在一個公共的,空方法體的,無參的構造器--> 226 <rule ref="rulesets/java/controversial.xml/UnnecessaryConstructor"/> 227 <!--Null賦值:將null賦值給變量(在聲明以外)經常是很差的形式。某些時候這種賦值表示程序員沒有想好代碼的下一步該作什麼。--> 228 <!--備註:當你須要把變量賦值爲null提示垃圾收集器去進行垃圾收集時這是有用的,那麼請忽略這個規則--> 229 <!--rule ref="rulesets/java/controversial.xml/NullAssignment"/--> 230 <!--只有一個返回:一個方法應該有且只有一處返回點,且應該是方法的最後一條語句。--> 231 <!--rule ref="rulesets/java/controversial.xml/OnlyOneReturn"/--> 232 <!--無用的修飾符:在接口中定義的域自動爲public static final的,方法自動是public abstract的,接口中嵌套的類或接口自動是public static的。因爲歷史緣由,上下文暗示的修飾符是被編譯器接受的,可是是多餘的。--> 233 <!--rule ref="rulesets/java/controversial.xml/UnusedModifier"/--> 234 <!--在操做中賦值:避免在操做中賦值;這會使代碼複雜而且難以閱讀--> 235 <!--rule ref="rulesets/java/controversial.xml/AssignmentInOperand"/--> 236 <!--至少有一個構造器:每一個類應該至少聲明一個構造器--> 237 <!--rule ref="rulesets/java/controversial.xml/AtLeastOneConstructor"/--> 238 <!--不要引入Sun包:避免從」sun.*」引入任何類,這些包不是輕便的並且可能更改--> 239 <rule ref="rulesets/java/controversial.xml/DontImportSun"/> 240 <!--使人迷惑的八進制轉義序列:在字符串字面量中出現使人迷惑的八進制轉義序列--> 241 <!--rule ref="rulesets/java/controversial.xml/SuspiciousOctalEscape"/--> 242 <!--在構造器中調用super():在構造器中調用super()方法是很好的作法.若是沒有調用super(),可是調用了另外的構造器,那麼這個規則不會報告出來--> 243 <!--rule ref="rulesets/java/controversial.xml/CallSuperInConstructor"/--> 244 <!--沒必要要的圓括號:有時候表達式被包在一個沒必要要的圓括號中,使它們看起來像是一個函數調用--> 245 <!--rule ref="rulesets/java/controversial.xml/UnnecessaryParentheses"/--> 246 <!--默認的包:使用明確的範圍代替默認的包私有的級別--> 247 <!--rule ref="rulesets/java/controversial.xml/DefaultPackage"/--> 248 <!--布爾轉換:使用按位轉換來轉換布爾值-這是最快的方法--> 249 <!--rule ref="rulesets/java/controversial.xml/BooleanInversion"/--> 250 <!--數據流異常分析:數據流分析是跟蹤本地的變量定義與否及在數據流中不一樣路徑的變量引用。--> 251 <!--由此能夠發現多種問題:1.UR-異常:指向一個以前沒有定義的變量,這是bug且可致使錯誤2.DU-異常:一個剛剛定義的變量是未定義的。這些異常可能出如今普通的源代碼文本中3.DD-異常:一個剛剛定義的變量從新定義。這是很差的但並不是必定是個bug。--> 252 <!--注:這個規則實在有點繞,具體含義我也不是很透徹理解!--> 253 <!-- 254 <rule ref="rulesets/java/controversial.xml/DataflowAnomalyAnalysis"> 255 <properties> 256 <property name="maxviolations" value="100"/> 257 <property name="maxpaths" value="1000"/> 258 </properties> 259 </rule> 260 --> 261 <!--避免Final類型的本地變量:避免使用final類型的本地變量,將它們轉爲類域--> 262 <!--rule ref="rulesets/java/controversial.xml/AvoidFinalLocalVariable"/--> 263 <!--避免使用short類型:Java使用’short’類型來減小內存開銷,而不是優化計算。事實上,JVM不具有short類型的算術能力:jvm必須將short類型轉化爲int類型,而後進行適當的計算再把int類型轉回short類型。所以,和內存開銷比起來使用’short’類型會對性能有更大的影響--> 264 <!--rule ref="rulesets/java/controversial.xml/AvoidUsingShortType"/--> 265 <!--避免使用Volatile:使用關鍵字’volatile’通常用來調整一個Java應用,所以,須要一個專業的Java內存模型。此外,它的做用範圍必定程度上是使人誤解的。所以,volatile關鍵字應該不要被用作維護和移植的目的。--> 266 <!--rule ref="rulesets/java/controversial.xml/AvoidUsingVolatile"/--> 267 <!--避免使用本地代碼:jvm和Java語言已經提供了不少建立應用程序的幫助,依賴非Java代碼應該是很是罕見的。即便如此,事實上必須使用Java本地接口也是罕見的。由於使用JNI使得應用可移植性下降,並且難以維護,因此是不推薦的。--> 268 <!--rule ref="rulesets/java/controversial.xml/AvoidUsingNativeCode"/--> 269 <!--避免改變訪問控制:getDeclaredConstructors(), getDeclaredConstructor(Class[]) 和 setAccessible(),還有PrivilegedAction接口,容許在運行時改變變量、類和方法的可見性,甚至它們是私有的。顯然,這是不該該的,由於這種動做違背了封裝原則--> 270 <rule ref="rulesets/java/controversial.xml/AvoidAccessibilityAlteration"/> 271 <!--不要顯示的調用垃圾收集器:調用System.gc(), Runtime.getRuntime().gc(), 和 System.runFinalization()是不推薦的。當垃圾收集器使用配置項-Xdisableexplicitgc關閉時,使用代碼能夠一樣進行垃圾收集。此外,現代JVM對於垃圾收集工做作得很棒。當開發一個應用時內存使用的影響無關於內存泄露時,垃圾收集應該交給JVM配置項進行管理而非代碼自己。--> 272 <rule ref="rulesets/java/controversial.xml/DoNotCallGarbageCollectionExplicitly"/> 273 <!--=========================controversial Rules end========================--> 274 275 276 <!--====================coupling Rules begin(共3個)======================--> 277 <!--對象間的耦合:這個規則統計一個對象中單個的屬性、本地變量和返回類型的數目。若是統計數目大於指定的上限值表示耦合度過高。--> 278 <!-- 279 <rule ref="rulesets/java/coupling.xml/CouplingBetweenObjects"> 280 <properties> 281 <property name="threshold" value="20"/> 282 </properties> 283 </rule> 284 --> 285 <!--過多的引入:大量的import代表對象有很高的耦合度。本規則統計單一的import數目,若是數目大於用戶定義的上限則報告一個違例。--> 286 <!-- 287 <rule ref="rulesets/java/coupling.xml/ExcessiveImports"> 288 <properties> 289 <property name="minimum" value="30"/> 290 </properties> 291 </rule> 292 --> 293 <!--鬆耦合:避免使用具體實現類型(如:HashSet);用接口(如:Set)代替。--> 294 <rule ref="rulesets/java/coupling.xml/LooseCoupling"/> 295 <!--====================coupling Rules end======================--> 296 297 298 <!--====================Design Rules begin(共48個)======================--> 299 <!--若是成員方法都是static,建議使用Singletom模式,或定義成abstract類。(FindBugs不檢查)--> 300 <!--<rule ref="rulesets/java/design.xml/UseSingleton"/>--> 301 <!--避免如下代碼 302 if (bar == x) { 303 return true; 304 } else { 305 return false; 306 }(FindBugs不檢查) 307 --> 308 <rule ref="rulesets/java/design.xml/SimplifyBooleanReturns"/> 309 <!--避免如下代碼 310 boolean bar = (isFoo() == true);(FindBugs不檢查) 311 --> 312 <rule ref="rulesets/java/design.xml/SimplifyBooleanExpressions"/> 313 <!--switch語句應該有一個default。(FindBugs不檢查)--> 314 <rule ref="rulesets/java/design.xml/SwitchStmtsShouldHaveDefault"/> 315 <!--避免較深的if語句,注意:有else的不算。(FindBugs不檢查)--> 316 <rule ref="rulesets/java/design.xml/AvoidDeeplyNestedIfStmts"> 317 <properties> 318 <property name="problemDepth" value="5"/> 319 </properties> 320 </rule> 321 <!--避免方法參數未使用就被賦值。(FindBugs檢查)--> 322 <!-- 323 <rule ref="rulesets/java/design.xml/AvoidReassigningParameters"/> 324 --> 325 <!--label下的語句太多,建議優化重構。(FindBugs不檢查)--> 326 <!-- 327 <rule ref="rulesets/java/design.xml/SwitchDensity"> 328 <properties> 329 <property name="minimum" value="10"/> 330 </properties> 331 </rule> 332 --> 333 <!-- 在構造方法中調用了可能會被覆蓋的成員方法,後果:可能會有空指針錯誤。(FindBugs不檢查) --> 334 <!--rule ref="rulesets/java/design.xml/ConstructorCallsOverridableMethod"/--> 335 <!-- 避免如下代碼,私有構造方法類在類定義外生成實例,這會致使the generation of an accessor。(FindBugs不檢查) 336 public class Outer { 337 void method(){ 338 Inner ic = new Inner();//Causes generation of accessor class 339 } 340 public class Inner { 341 private Inner(){} 342 } 343 } 344 --> 345 <rule ref="rulesets/java/design.xml/AccessorClassGeneration"/> 346 <!-- final成員變量(field,類字段)建議定義成static,這樣能夠節省空間 。(FindBugs不檢查)--> 347 <rule ref="rulesets/java/design.xml/FinalFieldCouldBeStatic"/> 348 <!-- Connection,Statement,ResultSet對象使用後要close。(FindBugs不檢查) --> 349 <!--rule ref="rulesets/java/design.xml/CloseResource"/--> 350 <!-- 不建議使用非靜態初始化塊 ,易引發混亂。(FindBugs不檢查)--> 351 <!--rule ref="rulesets/java/design.xml/NonStaticInitializer"/--> 352 <!-- switch中的default應放在最後一個。(FindBugs不檢查)--> 353 <rule ref="rulesets/java/design.xml/DefaultLabelNotLastInSwitchStmt"/> 354 <!-- switch中有非case的label。(FindBugs不檢查)--> 355 <rule ref="rulesets/java/design.xml/NonCaseLabelInSwitchStatement"/> 356 <!-- Collection.toArray(T[] a)調用中new a數組時要指定數組長度。(FindBugs檢查)--> 357 <!--rule ref="rulesets/java/design.xml/OptimizableToArrayCall"/--> 358 <!-- 避免與Double.NaN進行是否相等比較(==)。(FindBugs檢查)--> 359 <rule ref="rulesets/java/design.xml/BadComparison"/> 360 <!-- 避免與null比較,如x.equals(null) (FindBugs不檢查)--> 361 <rule ref="rulesets/java/design.xml/EqualsNull"/> 362 <!-- 避免if(x!=y),要先if(x==y) (FindBugs不檢查)--> 363 <!-- 364 <rule ref="rulesets/java/design.xml/ConfusingTernary"/> 365 --> 366 <!-- 爲了得到Class對象,請用類的class成員,而不要實例化對象而後getClass (FindBugs檢查)--> 367 <rule ref="rulesets/java/design.xml/InstantiationToGetClass"/> 368 <!-- 避免冪等操做,如變量賦值給它本身 (FindBugs檢查)--> 369 <!--rule ref="rulesets/java/design.xml/IdempotentOperations"/--> 370 <!-- 生成SimpleDateFormat實例的時候要求指定Locale(FindBugs不檢查) --> 371 <!--rule ref="rulesets/java/design.xml/SimpleDateFormatNeedsLocale"/--> 372 <!-- field在變量定義時或構造方法中賦值後就再也沒有改變過,則能夠定義成final的。(FindBugs不檢查) --> 373 <!--rule ref="rulesets/java/design.xml/ImmutableField"/--> 374 <!-- 在進行大小字轉換(String.toLowerCase()/toUpperCase() )的時候請使用Locale,能夠避免某些Locale帶來的問題(FindBugs檢查)--> 375 <!--rule ref="rulesets/java/design.xml/UseLocaleWithCaseConversions"/--> 376 <!-- final類不要出現protected字段(FindBugs檢查)--> 377 <!--rule ref="rulesets/java/design.xml/AvoidProtectedFieldInFinalClass"/--> 378 <!-- 賦值給靜態非final變量,可能會不安全。在靜態區賦值或定義時賦值則沒問題。(FindBugs檢查)--> 379 <!--rule ref="rulesets/java/design.xml/AssignmentToNonFinalStatic"/--> 380 <!-- 在不能實例化的類裏(定義了私有構造方法的類)沒有靜態方法,這樣這個類不可用。(FindBugs不檢查)--> 381 <rule ref="rulesets/java/design.xml/MissingStaticMethodInNonInstantiatableClass"/> 382 <!-- 用塊級別的同步代替方法級的同步,這樣可以保證讓真正須要的代碼同步(FindBugs不檢查)--> 383 <!--rule ref="rulesets/java/design.xml/AvoidSynchronizedAtMethodLevel"/--> 384 <!-- case沒有break(FindBugs檢查)--> 385 <!--rule ref="rulesets/java/design.xml/MissingBreakInSwitch"/--> 386 <!-- 用notifyAll取代notify(FindBugs檢查)--> 387 <rule ref="rulesets/java/design.xml/UseNotifyAllInsteadOfNotify"/> 388 <!-- 避免在catch子句裏再判斷具體的異常類型,就是用instanceof。(FindBugs不檢查)--> 389 <rule ref="rulesets/java/design.xml/AvoidInstanceofChecksInCatchClause"/> 390 <!-- 抽象類沒有定義任何抽象方法,若是類僅但願做爲基類使用,但又不須要抽象方法,則建議提供一個protected構造方法。(FindBugs不檢查)--> 391 <!--rule ref="rulesets/java/design.xml/AbstractClassWithoutAbstractMethod"/--> 392 <!-- 條件表達式中沒有必要在instanceof以前進行空指針判斷。(FindBugs不檢查)--> 393 <!--rule ref="rulesets/java/design.xml/SimplifyConditional"/--> 394 <!-- 建議用equals對象,而不是用==.(FindBugs檢查)--> 395 <!--rule ref="rulesets/java/design.xml/CompareObjectsWithEquals"/--> 396 <!-- 字符串變量與常量比較時,先寫常量,這樣能夠避免空指針異常。(FindBugs不檢查)--> 397 <!--rule ref="rulesets/java/design.xml/PositionLiteralsFirstInComparisons"/--> 398 <!-- 避免沒必要要的本地變量。(FindBugs不檢查)--> 399 <!--rule ref="rulesets/java/design.xml/UnnecessaryLocalBeforeReturn"/--> 400 <!-- 線程不安全的Singleton。(FindBugs不檢查)--> 401 <!-- 402 <rule ref="rulesets/java/design.xml/NonThreadSafeSingleton"> 403 <properties> 404 <property name="checkNonStaticMethods" value="true"/> 405 <property name="checkNonStaticFields" value="true"/> 406 </properties> 407 </rule> 408 --> 409 <!-- 未加註釋的空方法,在方法的花括弧之間未加註釋。(FindBugs不檢查)--> 410 <!--rule ref="rulesets/java/design.xml/UncommentedEmptyMethod"/--> 411 <!-- 未加註釋的空構造方法,在方法的花括弧之間未加註釋。注意,在super或this前的註釋不算。(FindBugs不檢查)--> 412 <!-- 413 <rule ref="rulesets/java/design.xml/UncommentedEmptyConstructor"> 414 <properties> 415 <property name="ignoreExplicitConstructorInvocation" value="true"/> 416 </properties> 417 </rule> 418 --> 419 <!-- 避免只有常量的接口定義,能夠考慮將其轉換成類。(FindBugs不檢查)--> 420 <!--rule ref="rulesets/java/design.xml/AvoidConstantsInterface"/--> 421 <!-- 靜態SimpleDateFormat成員變量訪問未加同步。(FindBugs檢查,另外FindBugs不建議定義靜態SimpleDateFormat成員變量)--> 422 <!--rule ref="rulesets/java/design.xml/UnsynchronizedStaticDateFormatter"/--> 423 <!-- catch到了異常後又從新throw新的異常,未保留源異常,源異常的stack trace可能會丟失,不利於程序調試。(FindBugs不檢查)--> 424 <rule ref="rulesets/java/design.xml/PreserveStackTrace"/> 425 <!-- 對Collection對象,建議用isEmpty()取代size()與0的判斷。(FindBugs不檢查)--> 426 <rule ref="rulesets/java/design.xml/UseCollectionIsEmpty"/> 427 <!-- 只有私有構造方法的類應該申明爲final的,除非構造方法被內部類調用。注,私有構造方法的類可以被它的內部類使用。(FindBugs不檢查)--> 428 <rule ref="rulesets/java/design.xml/ClassWithOnlyPrivateConstructorsShouldBeFinal"/> 429 <!-- 抽象類裏的空方法應該定義成abstract。(FindBugs不檢查)--> 430 <!-- 431 <rule ref="rulesets/java/design.xml/EmptyMethodInAbstractClassShouldBeAbstract"/> 432 --> 433 <!-- 某個類字段僅在一個方法中使用,建議改用本地變量。構造方法中有賦值不算,但定義時有初始值算。(FindBugs不檢查)--> 434 <!-- 435 <rule ref="rulesets/java/design.xml/SingularField"> 436 <properties> 437 <property name="CheckInnerClasses" value="true"/> 438 <property name="DisallowNotAssignment" value="true"/> 439 </properties> 440 </rule> 441 --> 442 <!-- 返回空數組,而不是null。(FindBugs檢查)--> 443 <rule ref="rulesets/java/design.xml/ReturnEmptyArrayRatherThanNull"/> 444 <!-- 若是一個抽象類不包含任何方法,只有數據字段,則建議定義private或protected的構造方法以不容許實例化。(FindBugs不檢查)--> 445 <!--rule ref="rulesets/java/design.xml/AbstractClassWithoutAnyMethod"/--> 446 <!-- switch的case語句若是太少的話建議用if取代,以增長代碼可讀性。(FindBugs不檢查)--> 447 <rule ref="rulesets/java/design.xml/TooFewBranchesForASwitchStatement"/> 448 <!-- 449 <properties> 450 <property name="minimumNumberCaseForASwitch" value="3"/> 451 </properties> 452 --> 453 <!--====================Design Rules end======================--> 454 455 456 <!--====================finalizers Rules begin(共6個)======================--> 457 <!--空的finalize():若是finalize()方法是空的,那麼它就不須要存在。--> 458 <rule ref="rulesets/java/finalizers.xml/EmptyFinalizer"/> 459 <!--finalize方法調用父類finalize:若是finalize()被實現,它應該除了調用super.finalize()以外還應該作點別的。--> 460 <rule ref="rulesets/java/finalizers.xml/FinalizeOnlyCallsSuperFinalize"/> 461 <!--finalize重載:方法名是finalize()的方法應該具備參數。由於不帶參數容易使人迷惑且多是一個bug,那樣就不會被JVM調用。--> 462 <rule ref="rulesets/java/finalizers.xml/FinalizeOverloaded"/> 463 <!--finalize沒有調用父類的finalize:若是finalize()方法被從新實現,它最後一個動做應該是調用super.finalize();--> 464 <rule ref="rulesets/java/finalizers.xml/FinalizeDoesNotCallSuperFinalize"/> 465 <!--finalize應該是受保護的:若是你覆蓋finalize(),使他是protected的,若是做爲public的,其它類就能夠調用了。--> 466 <!--rule ref="rulesets/java/finalizers.xml/FinalizeShouldBeProtected"/--> 467 <!--避免調用finalize:Object.finalize()是由垃圾收集器發現沒有引用指向這個對象的時候調用的,應儘可能避免人爲調用--> 468 <rule ref="rulesets/java/finalizers.xml/AvoidCallingFinalize"/> 469 <!--==========================finalizers Rules end==========================--> 470 471 472 <!--====================imports Rules begin(共5個)========================--> 473 <!--重複的引入:避免重複的import--> 474 <rule ref="rulesets/java/imports.xml/DuplicateImports"/> 475 <!--不要引入java.lang:避免從’java.lang’包引入任何東西,它裏面的類是自動引入的--> 476 <rule ref="rulesets/java/imports.xml/DontImportJavaLang"/> 477 <!--未使用的imports:去掉不使用的import--> 478 <rule ref="rulesets/java/imports.xml/UnusedImports"/> 479 <!--從同一個包引入:不須要從同一包引入類型--> 480 <rule ref="rulesets/java/imports.xml/ImportFromSamePackage"/> 481 <!--太多的靜態引入:若是濫用靜態引入特性,會使你的程序不具備可讀性和可維護性,你引入的太多的靜態成員污染--> 482 <!-- 483 <rule ref="rulesets/java/imports.xml/TooManyStaticImports"> 484 <properties> 485 <property name="maximumStaticImports" value="4"/> 486 </properties> 487 </rule> 488 --> 489 <!--=======================imports Rules end===========================--> 490 491 492 <!--====================j2ee Rules begin(共9個)======================--> 493 <!--使用合適的類加載器:在J2EE中getClassLoader()方法可能不會按照指望工做。使用Thread.currentThread().getContextClassLoader()來代替。--> 494 <!--rule ref="rulesets/java/j2ee.xml/UseProperClassLoader"/--> 495 <!--消息驅動bean和會話bean命名規則:EJB規範表示任何消息驅動bean和會話bean的命名應該以’Bean’結尾。 496 代碼示例: 497 /* Proper name */ 498 public class SomeBean implements SessionBean{} 499 500 /* Bad name */ 501 public class MissingTheProperSuffix implements SessionBean {} 502 --> 503 <!--rule ref="rulesets/java/j2ee.xml/MDBAndSessionBeanNamingConvention"/--> 504 <!--遠程會話接口命名規則:會話EJB的remote home接口命名應該以‘Home’結尾。 505 代碼示例: 506 /* Proper name */ 507 public interface MyBeautifulHome extends javax.ejb.EJBHome {} 508 509 /* Bad name */ 510 public interface MissingProperSuffix extends javax.ejb.EJBHome {} 511 --> 512 <!--rule ref="rulesets/java/j2ee.xml/RemoteSessionInterfaceNamingConvention"/--> 513 <!--本地接口會話命名規則:會話EJB的本地接口應該以‘Local’結尾。 514 代碼示例: 515 /* Proper name */ 516 public interface MyLocal extends javax.ejb.EJBLocalObject {} 517 518 /* Bad name */ 519 public interface MissingProperSuffix extends javax.ejb.EJBLocalObject {} 520 --> 521 <!--rule ref="rulesets/java/j2ee.xml/LocalInterfaceSessionNamingConvention"/--> 522 <!--本地Home命名規則:會話EJB的本地home接口應該以’LocalHome’結尾 523 代碼示例: 524 /* Proper name */ 525 public interface MyBeautifulLocalHome extends javax.ejb.EJBLocalHome {} 526 527 /* Bad name */ 528 public interface MissingProperSuffix extends javax.ejb.EJBLocalHome {} 529 --> 530 <!--rule ref="rulesets/java/j2ee.xml/LocalHomeNamingConvention"/--> 531 <!--遠程接口命名規則:會話EJB的遠程接口應該沒有後綴。 532 代碼示例: 533 /* Bad Session suffix */ 534 public interface BadSuffixSession extends javax.ejb.EJBObject {} 535 536 /* Bad EJB suffix */ 537 public interface BadSuffixEJB extends javax.ejb.EJBObject {} 538 539 /* Bad Bean suffix */ 540 public interface BadSuffixBean extends javax.ejb.EJBObject {} 541 --> 542 <!--rule ref="rulesets/java/j2ee.xml/RemoteInterfaceNamingConvention"/--> 543 <!--不要調用System.exit:web應用不應調用System.exit(),由於只有web容器或應用服務器才能中止JVM.--> 544 <!--rule ref="rulesets/java/j2ee.xml/DoNotCallSystemExit"/--> 545 <!--靜態EJB域應該是final的:根據J2EE規範(p.494),EJB不該該有任何具備寫入訪問權的靜態域,然而,只讀靜態域是容許的。這樣可以保證合適的行爲,尤爲當實例分佈存在於多個JRE的容器中--> 546 <!--rule ref="rulesets/java/j2ee.xml/StaticEJBFieldShouldBeFinal"/--> 547 <!--不用使用線程:J2EE規範明確禁止使用線程。備註:意思是已經由J2EE規範和成熟類庫幫你封裝了線程處理,本身儘可能不要用線程。--> 548 <!--rule ref="rulesets/java/j2ee.xml/DoNotUseThreads"/--> 549 <!--====================j2ee Rules end======================--> 550 551 552 <!--====================logging-jakarta-commons Rules begin(共2個)======================--> 553 <!--使用正確的異常日誌:保證打印出徹底的異常堆棧,記錄或拋出異常日誌時使用包含兩個參數的表達式:一個參數是字符串,一個是Throwable類型--> 554 <!--rule ref="rulesets/java/logging-jakarta-commons.xml/UseCorrectExceptionLogging"/--> 555 <!--合適的日誌記錄器:日誌記錄器通常應該被定義爲private static final的,並且應該有正確的類。Private final Log log;也被容許使用在須要傳遞的這種極少的狀況中,具備這種限制日誌記錄器就須要被傳入構造器中。--> 556 <!-- 557 <rule ref="rulesets/java/logging-jakarta-commons.xml/ProperLogger"> 558 <properties> 559 <property name="staticLoggerName" value="log"/> 560 </properties> 561 </rule> 562 --> 563 <!--====================logging-jakarta-commons Rules end======================--> 564 565 566 <!--====================logging-java Rules begin(共4個)======================--> 567 <!--多於一個日誌記錄器:通常而言一個日誌記錄器只用於一個類中。--> 568 <rule ref="rulesets/java/logging-java.xml/MoreThanOneLogger"/> 569 <!--日誌記錄器不是static final的:大多數狀況下,日誌記錄器應該被定義爲static和final的--> 570 <!--rule ref="rulesets/java/logging-java.xml/LoggerIsNotStaticFinal"/--> 571 <!--SystemPrintln:若是發現代碼當中使用了System.(out|err).print,應考慮使用日誌記錄代替--> 572 <rule ref="rulesets/java/logging-java.xml/SystemPrintln"/> 573 <!--避免使用PrintStackTrace:避免使用printStackTrace();使用日誌記錄器代替。--> 574 <rule ref="rulesets/java/logging-java.xml/AvoidPrintStackTrace"/> 575 <!--====================logging-java Rules end======================--> 576 577 578 <!--====================naming Rules begin(共18個)======================--> 579 <!--短變量:檢測出域或參數的名字命名很是短。--> 580 <!--rule ref="rulesets/java/naming.xml/ShortVariable"/--> 581 <!--長變量:檢測出域或參數的名字命名很是長。--> 582 <!-- 583 <rule ref="rulesets/java/naming.xml/LongVariable"> 584 <properties> 585 <property name="minimum" value="40"/> 586 </properties> 587 </rule> 588 --> 589 <!--短方法名:檢測出方法命名過短。--> 590 <rule ref="rulesets/java/naming.xml/ShortMethodName"/> 591 <!--變量命名約定:變量命名規則-根據你的喜愛調整。當前規則檢查final類型變量應該所有大寫並且非final變量應該不包含下劃線。--> 592 <rule ref="rulesets/java/naming.xml/VariableNamingConventions"/> 593 <!--方法命名約定:方法命名應該老是以小寫字符開頭,並且不該該包含下劃線。--> 594 <rule ref="rulesets/java/naming.xml/MethodNamingConventions"/> 595 <!--類命名約定:類名應該老是以大寫字符開頭--> 596 <rule ref="rulesets/java/naming.xml/ClassNamingConventions"/> 597 <!--抽象類命名:抽象類應該命名爲‘AbstractXXX’--> 598 <!--rule ref="rulesets/java/naming.xml/AbstractNaming"/--> 599 <!--避免美圓符號:在變量/方法/類/接口中避免使用美圓符號。--> 600 <rule ref="rulesets/java/naming.xml/AvoidDollarSigns"/> 601 <!--方法和封裝類同名:非構造方法不能和封裝類同名--> 602 <rule ref="rulesets/java/naming.xml/MethodWithSameNameAsEnclosingClass"/> 603 <!--使人疑惑的hashCode方法名:方法名和返回值相似於hashCode(),將使人誤解爲你試圖覆蓋hashCode()方法。--> 604 <rule ref="rulesets/java/naming.xml/SuspiciousHashcodeMethodName"/> 605 <!--使人疑惑的常量字段名:一個字段的名稱所有用大些字符表示是Sun的JAVA命名規則,表示這個是常量。然而,字段不是final的。--> 606 <rule ref="rulesets/java/naming.xml/SuspiciousConstantFieldName"/> 607 <!--使人迷惑的equals方法名:方法名和參數近似於equals(Object),可能讓人迷惑爲你想覆蓋equals(Object)方法--> 608 <rule ref="rulesets/java/naming.xml/SuspiciousEqualsMethodName"/> 609 <!--避免屬性和類同名:屬性和類同名易形成誤解,這可能意味着類型或屬性名能夠命名的更精確--> 610 <rule ref="rulesets/java/naming.xml/AvoidFieldNameMatchingTypeName"/> 611 <!--避免屬性和方法同名:屬性和方法同名易形成誤解。即便這是徹底合法的,但信息(屬性)和動做(方法)都沒有清晰地命名。--> 612 <rule ref="rulesets/java/naming.xml/AvoidFieldNameMatchingMethodName"/> 613 <!--沒有包:檢測到類或接口沒有定義在包裏面。--> 614 <rule ref="rulesets/java/naming.xml/NoPackage"/> 615 <!--包的大小寫:檢測到包的定義中包含大寫字符--> 616 <rule ref="rulesets/java/naming.xml/PackageCase"/> 617 <!--使人迷惑的變量名:檢測到非字段類型以m_開頭,這一般表示這是一個字段因此這種作法讓人迷惑。--> 618 <rule ref="rulesets/java/naming.xml/MisleadingVariableName"/> 619 <!--返回布爾類型的方法命名:發現返回布爾類型的方法被命名爲’getX()’,而慣例是命名爲‘isX()’的形式。--> 620 <rule ref="rulesets/java/naming.xml/BooleanGetMethodName"> 621 <properties> 622 <property name="checkParameterizedMethods" value="false"/> 623 </properties> 624 </rule> 625 <!--============================naming Rules end================================--> 626 627 628 <!--====================optimization Rules begin(共10個)======================--> 629 <!--本地變量能夠是Final的:本地變量只被賦值一次能夠聲明爲final的--> 630 <!--rule ref="rulesets/java/optimizations.xml/LocalVariableCouldBeFinal"/--> 631 <!--方法參數能夠是Final的:傳入方法的參數從不被賦值能夠聲明爲final的--> 632 <!--rule ref="rulesets/java/optimizations.xml/MethodArgumentCouldBeFinal"/--> 633 <!--避免在循環中實例化對象:本規則檢查在循環的內部用new建立對象--> 634 <!--rule ref="rulesets/java/optimizations.xml/AvoidInstantiatingObjectsInLoops"/--> 635 <!--使用ArrayList代替Vector:ArrayList是比Vector更好的集合類實現--> 636 <rule ref="rulesets/java/optimizations.xml/UseArrayListInsteadOfVector"/> 637 <!--簡化StartWith:字符串中截取長度爲1的字串時,能夠用高率一點的String.charAt()代替String.startsWith()--> 638 <!--rule ref="rulesets/java/optimizations.xml/SimplifyStartsWith"/--> 639 <!--使用StringBuffer來進行字串append操做:查找使用+=來鏈接字串的不良方式--> 640 <!--rule ref="rulesets/java/optimizations.xml/UseStringBufferForStringAppends"/--> 641 <!--使用Arrays類的asList方法:java.util.Arrays類有一個asList方法,當你試圖將一個對象數組轉換爲一個List時應該使用這個方法,這比循環從數據拷貝元素快得多。--> 642 <rule ref="rulesets/java/optimizations.xml/UseArraysAsList"/> 643 <!--避免數組循環:拷貝數組用System.arraycopy代替循環拷貝數組元素--> 644 <rule ref="rulesets/java/optimizations.xml/AvoidArrayLoops"/> 645 <!--沒必要要的包裝對象建立:解析方法應該被直接調用--> 646 <rule ref="rulesets/java/optimizations.xml/UnnecessaryWrapperObjectCreation"/> 647 <!--加空字符串:發現+「」操做。這是將其餘類型轉換爲字符串的低效的作法--> 648 <!--rule ref="rulesets/java/optimizations.xml/AddEmptyString"/--> 649 <!--====================optimization Rules end======================--> 650 651 652 <!--====================strictexception Rules begin(共9個)======================--> 653 <!--避免catch Throwable對象:這是危險的由於覆蓋的範圍太廣,它可以catch相似於OutOfMemoryError這樣的錯誤--> 654 <rule ref="rulesets/java/strictexception.xml/AvoidCatchingThrowable"/> 655 <!--具體聲明拋出的異常:不肯定方法中可以拋出什麼樣的具體異常。爲模糊的接口提供證實並理解它是很困難的。拋出的異常類要麼從RuntimeException中繼承或者拋出一個被檢查的異常。--> 656 <rule ref="rulesets/java/strictexception.xml/SignatureDeclareThrowsException"/> 657 <!--異經常使用做流程控制:使用異常來作流程控制會致使goto類型的代碼,且使得調試的時候發生的真正的異常含糊化。--> 658 <rule ref="rulesets/java/strictexception.xml/ExceptionAsFlowControl"/> 659 <!--避免捕獲空指針異常:在正常情形下代碼不該該捕獲NullPointException。不然Catch塊可能隱藏原始錯誤,致使其餘更多微妙的錯誤。--> 660 <rule ref="rulesets/java/strictexception.xml/AvoidCatchingNPE"/> 661 <!--避免拋出原始異常類型:避免拋出特定異常類型。與其拋出RuntimeException,Throwable,Exception,Error等原始類型,不如用他們的子異常或子錯誤類來替代。--> 662 <rule ref="rulesets/java/strictexception.xml/AvoidThrowingRawExceptionTypes"/> 663 <!--避免拋出空指針異常:避免拋出空指針異常——這會致使誤解,由於大部分人認爲這應該由虛擬機拋出。考慮用IllegalArgumentException代替,這對於開發者定義異常來講比較清晰。--> 664 <!--rule ref="rulesets/java/strictexception.xml/AvoidThrowingNullPointerException"/--> 665 <!--避免重複拋出異常:catch塊僅僅從新拋出一個已捕獲的異常只會增長代碼量和程序運行的複雜度。--> 666 <rule ref="rulesets/java/strictexception.xml/AvoidRethrowingException"/> 667 <!--不要繼承java.lang.Error:Error是系統異常,不要繼承它。--> 668 <rule ref="rulesets/java/strictexception.xml/DoNotExtendJavaLangError"/> 669 <!--不要在finally塊中拋出異常:在finally塊中拋出異常易形成迷惑。它將掩蓋代碼異常或缺陷,也促使代碼不穩定。備註:這是PMD從Lint4j原則衍生實現的--> 670 <rule ref="rulesets/java/strictexception.xml/DoNotThrowExceptionInFinally"/> 671 <!--====================strictexception Rules end======================--> 672 673 674 <!--====================sunsecure Rules begin(共2個)======================--> 675 <!--方法返回內部數組:暴露內部數組直接容許用戶修改的代碼會是很是危險的,返回一個數組的copy是安全的作法--> 676 <!--rule ref="rulesets/java/sunsecure.xml/MethodReturnsInternalArray"/--> 677 <!--數組被直接存儲:構造器和方法接收數組應該clone對象並保存副本,這會阻止用戶未來的改變影響內部的功能。--> 678 <!--rule ref="rulesets/java/sunsecure.xml/ArrayIsStoredDirectly"/--> 679 <!--==========================sunsecure Rules end===========================--> 680 681 682 <!--============String and StringBuffer Rules Rules begin(共15個)===============--> 683 <!--避免重複的字面量:代碼包含重複的字符串經常能夠重構爲將此字符串聲明爲常量--> 684 <!-- 685 <rule ref="rulesets/java/strings.xml/AvoidDuplicateLiterals"> 686 <properties> 687 <property name="threshold" value="4"/> 688 </properties> 689 </rule> 690 --> 691 <!--字符串初始化:避免初始化字符串對象;這是沒必要要的。--> 692 <rule ref="rulesets/java/strings.xml/StringInstantiation"/> 693 <!--String.toString():避免對字符串對象調用toString()方法,這是沒必要要的--> 694 <rule ref="rulesets/java/strings.xml/StringToString"/> 695 <!--低效的StringBuffering:避免在StringBuffer的構造器或append()方法中鏈接非字面量類型--> 696 <!--rule ref="rulesets/java/strings.xml/InefficientStringBuffering"/--> 697 <!--沒必要要的大小寫轉換:使用equalsIgnoreCase()比將字符串大小寫轉換一致後再比較要快。--> 698 <rule ref="rulesets/java/strings.xml/UnnecessaryCaseChange"/> 699 <!--使用StringBuffer的length()方法:使用StringBuffer對象的length()方法來計算StringBuffer對象的長度,而不是使用StringBuffer.toString().equals("") or StringBuffer.toString().length() ==.等方法--> 700 <rule ref="rulesets/java/strings.xml/UseStringBufferLength"/> 701 <!--用char類型鏈接字符:在使用StringBuffer的append()方法鏈接字符時,避免使用string類型。--> 702 <rule ref="rulesets/java/strings.xml/AppendCharacterWithChar"/> 703 <!--連續的字面量鏈接:鏈接字符串時連續的調用StringBuffer的append()方法--> 704 <!-- 705 <rule ref="rulesets/java/strings.xml/ConsecutiveLiteralAppends"> 706 <properties> 707 <property name="threshold" value="1"/> 708 </properties> 709 </rule> 710 --> 711 <!--使用indexOf(字符):當你檢測單個字符的位置時使用String.indexOf(字符),它執行的很快。不要使用indexOf(字符串)--> 712 <!--rule ref="rulesets/java/strings.xml/UseIndexOfChar"/--> 713 <!--低效的空字符串檢查:用String.trim().length()來判斷字符串是否空是低效的作法,由於它會建立一個新的字符串對象而後判斷大小。考慮建立一個靜態的方法循環String,用isWhitespace()檢查每一個字符若是遇到非空白字符就返回false--> 714 <!--rule ref="rulesets/java/strings.xml/InefficientEmptyStringCheck"/--> 715 <!--不充分的StringBuffer聲明:若是不能在事前聲明合適大小的StringBuffer容量可能致使運行期不斷地從新分配大小。本規則檢查字符事實上傳遞給StringBuffer.append(),可是代表了在最壞狀況下的最好的預測。空參數的StringBuffer構造器默認將對象初始化爲16個字符的容量。這個默認狀況是在構造長度沒法肯定的狀況下假定的。--> 716 <!--rule ref="rulesets/java/strings.xml/InsufficientStringBufferDeclaration"/--> 717 <!--無用的valueOf方法:調用append()方法時不須要把參數用valueOf()轉換一次,直接將非String類型的值做爲參數放在append()裏面。--> 718 <rule ref="rulesets/java/strings.xml/UselessStringValueOf"/> 719 <!--StringBuffer使用字符初始化:StringBuffer sb = new StringBuffer('c');字符c會轉換爲int值,做爲StringBuffer的初始化大小參數。--> 720 <rule ref="rulesets/java/strings.xml/StringBufferInstantiationWithChar"/> 721 <!--使用equals方法比較字符串:使用‘==’或‘!=’比較字符串大小隻是比較兩邊的常量池的引用。--> 722 <rule ref="rulesets/java/strings.xml/UseEqualsToCompareStrings"/> 723 <!--避免在類中使用StringBuffer屬性:StringBuffer類型變量能夠變得很是龐大,因此可能形成內存泄漏。(若是宿主類有很長的生命期)--> 724 <!--rule ref="rulesets/java/strings.xml/AvoidStringBufferField"/--> 725 <!--===========================strings Rules end=============================--> 726 727 728 <!--====================unusedcode Rules begin(共4個)======================--> 729 <!--未用的私有變量:檢測到私有變量被聲明或被賦值,可是未使用--> 730 <rule ref="rulesets/java/unusedcode.xml/UnusedPrivateField"/> 731 <!--未用的本地變量:檢測到本地變量被聲明或被賦值,可是未使用--> 732 <rule ref="rulesets/java/unusedcode.xml/UnusedLocalVariable"/> 733 <!--未用的私有方法:檢測到已聲明但未使用的私有方法--> 734 <rule ref="rulesets/java/unusedcode.xml/UnusedPrivateMethod"/> 735 <!--未用的常規參數:避免傳遞給方法或構造器不使用的參數--> 736 <rule ref="rulesets/java/unusedcode.xml/UnusedFormalParameter"/> 737 <!--=======================unusedcode Rules end==============================--> 738 </ruleset>
最後,分享一下maven工程下如何使用:程序員
使用步驟: 步驟一、 將自定義規則文件cplatform_pmd5.2.3_rules.xml拷貝到任意目錄下 步驟二、 在maven工程的pom.xml里加入PMD插件配置,並指定自定義規則文件的路徑: <reporting> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-pmd-plugin</artifactId> <version>3.3</version> <configuration> <failurePriority>5</failurePriority> <failOnViolation>true</failOnViolation> <targetJdk>1.7</targetJdk> <verbose>true</verbose> <outputEncoding>UTF-8</outputEncoding> <rulesets> <!-- 指定PMD使用的規則 --> <ruleset>C:\MyEclipseWorkSpace\PMDRules\cplatform_pmd_rules.xml</ruleset> </rulesets> <!-- 指定只掃描特定的包或者文件 --> <!-- <includes> <include>**\/package\/**.java</include> <include>**\/otherpackage\/**.java</include> </includes> --> </configuration> <!-- 指定在編譯打包期間執行檢查 --> <!-- <executions> <execution> <phase>package</phase> <goals> <goal>check</goal> </goals> </execution> </executions> --> </plugin> </plugins> </reporting> 步驟三、 項目工程右鍵執行Maven build,輸入命令pmd:pmd、pmd:check、pmd:cpd、pmd:cpd-check等命令進行代碼檢查, 會在控制檯輸出檢查結果,並在target目錄下生成檢查報告。