Talk is cheap,Show me the code !

扩大
缩小
返回顶部

MyEclipse集成PMD代码检测插件自定义规则配置文件

2015年01月01日开通了博客园我的博客功能,承接着2014的忙碌,到今天稍微松缓一些,第一篇博文就把我今天最新更新的MyEclipse2014集成PMD代码检测插件自定义规则配置文件JAVA版发布出来吧,方便自己以后回顾的同时,也看看能不能帮到有这方面需求的小伙伴们。

不要问我PMD是什么?请GOOGLE之或者无视之。文件名:cplatform_pmd5.2.3_rules.xml

  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      推荐指数:3、4、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      推荐指数:3、4、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工程下如何使用:

使用步骤:
步骤1、
    将自定义规则文件cplatform_pmd5.2.3_rules.xml拷贝到任意目录下
步骤2、
    在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>
步骤3、
    项目工程右键执行Maven build,输入命令pmd:pmd、pmd:check、pmd:cpd、pmd:cpd-check等命令进行代码检查,
    会在控制台输出检查结果,并在target目录下生成检查报告。

 

posted @ 2015-01-13 14:26  风之子研究院  阅读(2409)  评论(0)    收藏  举报