Optimization Rules
优化规则
These rules deal with different optimizations that generally apply to performance best practices.
LocalVariableCouldBeFinal
Since: PMD 2.2
局部变量只被赋值一次可以声明为final.
This rule is defined by the following Java class: net.sourceforge.pmd.rules.optimization.LocalVariableCouldBeFinal
例子:
public class Bar {
public void foo() {
String a = "a"; // if a will not be assigned again it is better to do this:
final String b = "b";
}
}
AvoidInstantiatingObjectsInLoops
Since: PMD 2.2
侦测在循环中创建一个新对象
This rule is defined by the following Java class: net.sourceforge.pmd.rules.optimization.AvoidInstantiatingObjectsInLoops
Example:
public class Something {
public static void main( String as[] ) {
for (int i = 0; i < 10; i++) {
Foo f = new Foo(); //Avoid this whenever you can it's really expensive
}
}
}
UseArrayListInsteadOfVector
Since: PMD 3.0
ArrayList是个比Vector更好的Collection实现。
This rule is defined by the following XPath expression:
//AllocationExpression
/ClassOrInterfaceType[@Image='Vector' or @Image='java.util.Vector']
例子:
public class SimpleTest extends TestCase {
public void testX() {
Collection c = new Vector();
// This achieves the same with much better performance
// Collection c = new ArrayList();
}
}
SimplifyStartsWith
Since: PMD 3.1
由于传入长度为1的字面意义参数,这调用String.startsWith 可以使用 String.charAt(0) 重写节省一些时间。
This rule is defined by the following XPath expression:
//PrimaryExpression
[PrimaryPrefix/Name
[ends-with(@Image, '.startsWith')]]
[PrimarySuffix/Arguments/ArgumentList
/Expression/PrimaryExpression/PrimaryPrefix
/Literal
[string-length(@Image)=3]
[starts-with(@Image, '"')]
[ends-with(@Image, '"')]
]
例子:
public class Foo {
boolean checkIt(String x) {
return x.startsWith("a");
}
}
UseArraysAsList
Since: PMD 3.5
当你想要从一个对象数组创建一个新List ,应该使用java.util.Arrays 类的"asList"方法. 比执行一个循环逐个地复制数组的所有元素快地多
This rule is defined by the following XPath expression:
//Statement[
(ForStatement) and (count(.//IfStatement)=0)
]
//StatementExpression[
PrimaryExpression/PrimaryPrefix/Name[
substring-before(@Image,'.add') = ancestor::MethodDeclaration//LocalVariableDeclaration[
./Type//ClassOrInterfaceType[
@Image = 'Collection' or
@Image = 'List' or @Image='ArrayList'
]
]
/VariableDeclarator/VariableDeclaratorId[
count(..//AllocationExpression/ClassOrInterfaceType[
@Image="ArrayList"
]
)=1
]/@Image
]
and
PrimaryExpression/PrimarySuffix/Arguments/ArgumentList/Expression/PrimaryExpression/PrimaryPrefix/Name
[@Image = ancestor::MethodDeclaration//LocalVariableDeclaration
[@Array="true"]/VariableDeclarator/VariableDeclaratorId/@Image]
/../..[count(.//PrimarySuffix)
=1]/PrimarySuffix/Expression/PrimaryExpression/PrimaryPrefix
/Name
]
例子:
public class Test {
public void foo(Integer[] ints) {
// could just use Arrays.asList(ints)
List l= new ArrayList(10);
for (int i=0; i< 100; i++) {
l.add(ints[i]);
}
for (int i=0; i< 100; i++) {
l.add(a[i].toString()); // won't trigger the rule
}
}
}
AvoidArrayLoops
Since: PMD 3.5
替换两个数组之间复制数据, 使用System.arraycopy方法
This rule is defined by the following XPath expression:
//Statement[(ForStatement or WhileStatement) and
count(*//AssignmentOperator[@Image = '='])=1
and
*/Statement
[
./Block/BlockStatement/Statement/StatementExpression/PrimaryExpression
/PrimaryPrefix/Name/../../PrimarySuffix/Expression
[(PrimaryExpression or AdditiveExpression) and count
(.//PrimaryPrefix/Name)=1]//PrimaryPrefix/Name/@Image
and
./Block/BlockStatement/Statement/StatementExpression/Expression/PrimaryExpression
/PrimaryPrefix/Name/../../PrimarySuffix[count
(..//PrimarySuffix)=1]/Expression[(PrimaryExpression
or AdditiveExpression) and count(.//PrimaryPrefix/Name)=1]
//PrimaryPrefix/Name/@Image
]]
例子:
public class Test {
public void bar() {
int[] a = new int[10];
int[] b = new int[10];
for (int i=0;i<10;i++) {
b[i]=a[i];
}
}
}
// this will trigger the rule
for (int i=0;i<10;i++) {
b[i]=a[c[i]];
}
}
}
UnnecessaryWrapperObjectCreation
Since: PMD 3.8
Parsing method 应该直接地调用Parsing方法。
This rule is defined by the following Java class: net.sourceforge.pmd.rules.optimization.UnnecessaryWrapperObjectCreation
例子:
public int convert(String s) {
int i, i2;
i = Integer.valueOf(s).intValue(); // this wastes an object
i = Integer.parseInt(s); // this is better
i2 = Integer.valueOf(i).intValue(); // this wastes an object
i2 = i; // this is better
return i2;
}
AddEmptyString
Since: PMD 4.0
查找添加的空白字符串. 这是一个低效的方法,将任何类型转换为字符串。
This rule is defined by the following XPath expression:
//AdditiveExpression/PrimaryExpression/PrimaryPrefix/Literal[@Image='""']
例子:
String s = "" + 123; // bad
String t = Integer.toString(456); // ok
相关推荐
java代码静态分析工具 - PMD规则集说明(java包)中文 自己手工搜集,中英文说明,参数说明等
规则集是一系列相关规则的集合,通常按类别划分,如设计、冗余代码、复杂度等。在XML文件中,规则集以`<ruleset>`标签表示,包含多个规则定义。 2. **规则(Rule)** 每个规则代表一个特定的检查,如“避免使用空...
本教程将详细介绍如何在 Eclipse 中配置和替换 Checkstyle、PMD 的规则集,以及如何修改代码格式化模板。 首先,我们来了解一下 Checkstyle。Checkstyle 是一个开源项目,它提供了对 Java 代码风格的检查,包括但不...
1. **基础规则(Basic Rules)**:基础规则集包含了应被广泛遵循的良好编程实践。例如,检查是否正确使用了if、else、for、while等语句的花括号,避免出现空的或者无效的代码块。 2. **大括号规则(Braces Rules)*...
本文将详细介绍如何在Eclipse中修改Checkstyle和PMD的规则集。 首先,让我们了解这两个工具的基础知识: **Checkstyle** 是一个静态代码分析工具,它根据预定义或自定义的编码规范检查Java源代码,以发现潜在的...
2. **配置PMD设置**:在MyEclipse的首选项或设置中找到PMD选项,配置规则集,选择想要应用的PMD规则。 3. **启用PMD检查**:在项目的构建路径或编译器设置中开启PMD,设置检查级别,如错误或警告。 4. **运行PMD检查...
通过一系列预定义的规则集,PMD可以帮助开发者编写出更高质量、更易维护的代码。BasicRules是PMD提供的一组核心规则,包含了每个开发人员都应该遵循的基本编程实践。 #### 二、重要规则解析 1. **EmptyCatchBlock...
### 在Eclipse中修改Checkstyle、PMD及FindBugs规则集的方法 #### 一、Checkstyle规则集的修改 **1. 替换Checkstyle规则集** 在Eclipse中更新Checkstyle规则集通常涉及几个步骤: - **备份现有配置**:首先确保...
3. **配置规则**:在SonarQube的管理界面中,可以设置PMD的规则集,选择启用哪些规则,以及调整规则的严重级别。 4. **执行分析**:在项目分析时,SonarQube会自动运行PMD插件,并将结果展示在项目仪表板上,以便...
PMD通过自定义规则集可以满足特定项目的质量控制需求。在Motech项目中,自定义PMD规则被用来提升代码质量,特别是针对注释掉的代码进行检查。 **一、PMD工作原理** PMD通过解析Java源代码,运用正则表达式和语法树...
PMD_ruleset规则文件,已经最基本的验证进行了导入。在Eclipse导入即可
PMD是一款开源的静态代码检测工具,可以检查代码的质量问题,文件是对PMD检测规则进行说明,解压密码:PMD。
**PMD规则集详解——优化Java应用程序的关键** PMD(Pattern Matching for Java)是一款静态代码分析工具,旨在帮助开发者发现并修复代码中的潜在问题、不良习惯和可能的错误。PMD通过检查源代码来实现这一目标,它...
自己整理的PMD检查的各个规则说明,其中打○的是我自己用的规则,大家自己按实际需要选择吧,有不对的地方请多多指教。
PMD 规则编写是用户自定义 PMD 规则的一种方式。用户可以通过编写 XML 文件来定义自己的规则。PMD 规则编写需要满足一定的格式和语法要求,否则可能会导致规则无法生效。 4. PMD 的优点 PMD 是一款功能强大且易于...
需要在build.xml文件中配置PMD的规则集和要分析的目标源代码路径。 5. 关于 PMD 规则 PMD的规则分为多个类别,如Design、Error Prone、Performance、Maintainability和Best Practices。每个规则都有一个独特的ID,...
1. **配置规则集**: 安装完成后,可以在Eclipse的首选项设置中配置PMD规则集,选择想要启用的规则。PMD提供了多种内置规则集,如基本、最佳实践、设计、冗余代码等,可以根据项目需求自定义。 2. **运行分析**: 在...
2. **定制规则集**:PMD支持自定义规则集,允许开发者根据团队的编码规范和项目需求调整检查规则,以更好地匹配项目特性。 3. **代码优化**:PMD不仅能发现潜在的bug,还能识别出可能导致性能下降的代码,例如未...
PMD的核心功能是通过解析Java源代码,应用预定义的规则集来检查代码中的问题。这些规则涵盖了许多方面,包括可能的空指针异常、未使用的变量、过长的方法、复杂的条件表达式等。PMD不仅支持命令行使用,还提供了集成...
1. **配置规则集:** 安装完成后,可以在 "Window" -> "Preferences" -> "PMD" 中配置 PMD 规则集。这里可以选择预设的规则集,如 "Basic"、"Design"、"Naming" 等,也可以自定义规则集。 2. **运行 PMD 检查:** ...