Since: PMD 3.4
Consider replacing Vector usages with the newer java.util.ArrayList if expensive threadsafe operation is not required.
This rule is defined by the following XPath expression:
//Type/ReferenceType/ClassOrInterfaceType[@Image='Vector']
Example:
public class Foo {
void bar() {
Vector v = new Vector();
}
}
Since: PMD 3.4
Consider replacing this Hashtable with the newer java.util.Map
This rule is defined by the following XPath expression:
//Type/ReferenceType/ClassOrInterfaceType[@Image='Hashtable']
Example:
public class Foo {
void bar() {
Hashtable h = new Hashtable();
}
}
Since: PMD 3.4
Consider replacing this Enumeration with the newer java.util.Iterator
This rule is defined by the following XPath expression:
//ImplementsList/ClassOrInterfaceType[@Image='Enumeration']
Example:
public class Foo implements Enumeration {
private int x = 42;
public boolean hasMoreElements() {
return true;
}
public Object nextElement() {
return String.valueOf(i++);
}
}
Since: PMD 3.4
Finds all places where 'enum' is used as an identifier.
This rule is defined by the following XPath expression:
//VariableDeclaratorId[@Image='enum']
Example:
public class A {
public class foo {
String enum = "foo";
}
}
Since: PMD 3.4
Finds all places where 'assert' is used as an identifier.
This rule is defined by the following XPath expression:
//VariableDeclaratorId[@Image='assert']
Example:
public class A {
public class foo {
String assert = "foo";
}
}
Since: PMD 3.5
In JDK 1.5, calling new Integer() causes memory allocation. Integer.valueOf() is more memory friendly.
This rule is defined by the following XPath expression:
//PrimaryPrefix
/AllocationExpression
[not (ArrayDimsAndInits)
and (ClassOrInterfaceType/@Image='Integer'
or ClassOrInterfaceType/@Image='java.lang.Integer')]
Example:
public class Foo {
private Integer i = new Integer(0); // change to Integer i = Integer.valueOf(0);
}
Since: PMD 4.0
In JDK 1.5, calling new Byte() causes memory allocation. Byte.valueOf() is more memory friendly.
This rule is defined by the following XPath expression:
//PrimaryPrefix/AllocationExpression
[not (ArrayDimsAndInits)
and (ClassOrInterfaceType/@Image='Byte'
or ClassOrInterfaceType/@Image='java.lang.Byte')]
Example:
public class Foo {
private Byte i = new Byte(0); // change to Byte i =
Byte.valueOf(0);
}
Since: PMD 4.0
In JDK 1.5, calling new Short() causes memory allocation. Short.valueOf() is more memory friendly.
This rule is defined by the following XPath expression:
//PrimaryPrefix
/AllocationExpression
[not (ArrayDimsAndInits)
and (ClassOrInterfaceType/@Image='Short'
or ClassOrInterfaceType/@Image='java.lang.Short')]
Example:
public class Foo {
private Short i = new Short(0); // change to Short i =
Short.valueOf(0);
}
Since: PMD 4.0
In JDK 1.5, calling new Long() causes memory allocation. Long.valueOf() is more memory friendly.
This rule is defined by the following XPath expression:
//PrimaryPrefix
/AllocationExpression
[not (ArrayDimsAndInits)
and (ClassOrInterfaceType/@Image='Long'
or ClassOrInterfaceType/@Image='java.lang.Long')]
Example:
public class Foo {
private Long i = new Long(0); // change to Long i =
Long.valueOf(0);
}
Since: PMD 4.0
In JUnit 3, the setUp method was used to set up all data entities required in running tests. JUnit 4 skips the setUp method and executes all methods annotated with @Before before all tests
This rule is defined by the following XPath expression:
//ClassOrInterfaceBodyDeclaration[MethodDeclaration/MethodDeclarator[@Image='setUp']]
[count(Annotation/MarkerAnnotation/Name[@Image='Before'])=0]
Example:
public class MyTest {
public void setUp() {
bad();
}
}
public class MyTest2 {
@Before public void setUp() {
good();
}
}
Since: PMD 4.0
In JUnit 3, the tearDown method was used to clean up all data entities required in running tests. JUnit 4 skips the tearDown method and executes all methods annotated with @After after running each test
This rule is defined by the following XPath expression:
//ClassOrInterfaceBodyDeclaration[MethodDeclaration/MethodDeclarator[@Image='tearDown']]
[count(Annotation/MarkerAnnotation/Name[@Image='After'])=0]
Example:
public class MyTest {
public void tearDown() {
bad();
}
}
public class MyTest2 {
@After public void tearDown() {
good();
}
}
Since: PMD 4.0
In JUnit 3, the framework executed all methods which started with the word test as a unit test. In JUnit 4, only methods annotated with the @Test annotation are executed.
This rule is defined by the following XPath expression:
//ClassOrInterfaceBodyDeclaration[MethodDeclaration/MethodDeclarator[starts-with(@Image,'test')]]
[count(Annotation//Name[@Image='Test'])=0]
Example:
public class MyTest {
public void testBad() {
doSomething();
}
@Test
public void testGood() {
doSomething();
}
}
Since: PMD 4.0
In JUnit 3, test suites are indicated by the suite() method. In JUnit 4, suites are indicated through the @RunWith(Suite.class) annotation.
This rule is defined by the following XPath expression:
//ClassOrInterfaceBodyDeclaration[MethodDeclaration/MethodDeclarator[@Image='suite']]
[MethodDeclaration/ResultType/Type/ReferenceType/ClassOrInterfaceType[@Image='Test' or @Image = 'junit.framework.Test']]
[not(MethodDeclaration/Block//ClassOrInterfaceType[@Image='JUnit4TestAdapter'])]
Example:
public class BadExample extends TestCase{
public static Test suite(){
return new Suite();
}
}
@RunWith(Suite.class)
@SuiteClasses( { TestOne.class, TestTwo.class })
public class GoodTest {
}
Since: PMD 4.0
This rule is defined by the following Java class: net.sourceforge.pmd.rules.migration.JUnitUseExpected
Example:
public class MyTest {
@Test
public void testBad() {
try {
doSomething();
fail("should have thrown an exception");
} catch (Exception e) {
}
}
@Test(expected=Exception.class)
public void testGood() {
doSomething();
}
}