Since: PMD 0.1
Avoid the use temporary objects when converting primitives to Strings. Use the static conversion methods on the wrapper classes instead.
This rule is defined by the following Java class: net.sourceforge.pmd.lang.java.rule.unnecessary.UnnecessaryConversionTemporaryRule
Example(s):public String convert(int x) { String foo = new Integer(x).toString(); // this wastes an object return Integer.toString(x); // preferred approach }
This rule has the following properties:
Name | Default Value | Description |
---|---|---|
violationSuppressRegex | Suppress violations with messages matching a regular expression | |
violationSuppressXPath | Suppress violations on nodes which match a given relative XPath expression. |
Since: PMD 1.3
Avoid the use of unnecessary return statements.
This rule is defined by the following Java class: net.sourceforge.pmd.lang.java.rule.unnecessary.UnnecessaryReturnRule
Example(s):public class Foo { public void bar() { int x = 42; return; } }
This rule has the following properties:
Name | Default Value | Description |
---|---|---|
violationSuppressRegex | Suppress violations with messages matching a regular expression | |
violationSuppressXPath | Suppress violations on nodes which match a given relative XPath expression. |
Since: PMD 3.0
When a class has the final modifier, all the methods are automatically final and do not need to be tagged as such.
//ClassOrInterfaceDeclaration[@Final='true' and @Interface='false'] /ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/MethodDeclaration[@Final='true']
public final class Foo { // This final modifier is not necessary, since the class is final // and thus, all methods are final private final void foo() { } }
Since: PMD 3.3
The overriding method merely calls the same method defined in a superclass.
This rule is defined by the following Java class: net.sourceforge.pmd.lang.java.rule.unnecessary.UselessOverridingMethodRule
Example(s):public void foo(String bar) { super.foo(bar); // why bother overriding? } public String foo() { return super.foo(); // why bother overriding? } @Id public Long getId() { return super.getId(); // OK if 'ignoreAnnotations' is false, which is the default behavior }
This rule has the following properties:
Name | Default Value | Description |
---|---|---|
violationSuppressRegex | Suppress violations with messages matching a regular expression | |
violationSuppressXPath | Suppress violations on nodes which match a given relative XPath expression. | |
ignoreAnnotations | false | Ignore annotations |
Since: PMD 3.5
An operation on an Immutable object (String, BigDecimal or BigInteger) won't change the object itself since the result of the operation is a new object. Therefore, ignoring the operation result is an error.
This rule is defined by the following Java class: net.sourceforge.pmd.lang.java.rule.unnecessary.UselessOperationOnImmutableRule
Example(s):import java.math.*; class Test { void method1() { BigDecimal bd=new BigDecimal(10); bd.add(new BigDecimal(5)); // this will trigger the rule } void method2() { BigDecimal bd=new BigDecimal(10); bd = bd.add(new BigDecimal(5)); // this won't trigger the rule } }
This rule has the following properties:
Name | Default Value | Description |
---|---|---|
violationSuppressRegex | Suppress violations with messages matching a regular expression | |
violationSuppressXPath | Suppress violations on nodes which match a given relative XPath expression. |
Since: PMD 3.5
After checking an object reference for null, you should invoke equals() on that object rather than passing it to another object's equals() method.
(//PrimaryPrefix[ends-with(Name/@Image, '.equals') and Name/@Image != 'Arrays.equals'] | //PrimarySuffix[@Image='equals' and not(../PrimaryPrefix/Literal)]) /following-sibling::PrimarySuffix/Arguments/ArgumentList/Expression /PrimaryExpression[count(PrimarySuffix)=0]/PrimaryPrefix /Name[@Image = ./../../../../../../../../../../Expression/ConditionalAndExpression /EqualityExpression[@Image="!=" and count(./preceding-sibling::*)=0 and ./PrimaryExpression/PrimaryPrefix/Literal/NullLiteral] /PrimaryExpression/PrimaryPrefix/Name/@Image]
public class Test { public String method1() { return "ok";} public String method2() { return null;} public void method(String a) { String b; // I don't know it method1() can be "null" // but I know "a" is not null.. // I'd better write a.equals(method1()) if (a!=null && method1().equals(a)) { // will trigger the rule //whatever } if (method1().equals(a) && a != null) { // won't trigger the rule //whatever } if (a!=null && method1().equals(b)) { // won't trigger the rule //whatever } if (a!=null && "LITERAL".equals(a)) { // won't trigger the rule //whatever } if (a!=null && !a.equals("go")) { // won't trigger the rule a=method2(); if (method1().equals(a)) { //whatever } } } }
Since: PMD 5.0
Useless parentheses should be removed.
//Expression/PrimaryExpression/PrimaryPrefix/Expression[count(*)=1 and count(./CastExpression)=0 and count(./ConditionalExpression[@Ternary='true'])=0] | //Expression/ConditionalAndExpression/PrimaryExpression/PrimaryPrefix/Expression[ count(*)=1 and count(./CastExpression)=0 and count(./EqualityExpression/MultiplicativeExpression)=0 and count(./ConditionalOrExpression)=0] | //Expression/ConditionalOrExpression/PrimaryExpression/PrimaryPrefix/Expression[ count(*)=1 and count(./CastExpression)=0 and count(./EqualityExpression/MultiplicativeExpression)=0] | //Expression/ConditionalExpression/PrimaryExpression/PrimaryPrefix/Expression[ count(*)=1 and count(./CastExpression)=0 and count(./EqualityExpression)=0] | //Expression/AdditiveExpression[not(./PrimaryExpression/PrimaryPrefix/Literal[@StringLiteral = 'true'])]/PrimaryExpression[1]/PrimaryPrefix/Expression[ count(*)=1 and not(./CastExpression) and not(./ConditionalExpression) and not(./ShiftExpression)] | //Expression/EqualityExpression/PrimaryExpression/PrimaryPrefix/Expression[ count(*)=1 and count(./CastExpression)=0 and count(./AndExpression)=0 and count(./InclusiveOrExpression)=0 and count(./ExclusiveOrExpression)=0 and count(./ConditionalAndExpression)=0 and count(./ConditionalOrExpression)=0]
public class Foo { private int _bar1; private Integer _bar2; public void setBar(int n) { _bar1 = Integer.valueOf((n)); // here _bar2 = (n); // and here } }