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目录下生成检查报告。