Type Resolution

These are rules which resolve java Class files for comparison, as opposed to a String


Since: PMD 3.9

Avoid using implementation types (i.e., HashSet); use the interface (i.e, Set) instead

This rule is defined by the following Java class:net.sourceforge.pmd.lang.java.typeresolution.rules.LooseCoupling


import java.util.ArrayList;
import java.util.HashSet;

public class Bar {
		// Use List instead
	private ArrayList list = new ArrayList();
		// Use Set instead
	public HashSet getFoo() {
    return new HashSet();


Since: PMD 3.9

The method clone() should only be implemented if the class implements the Cloneable interface with the exception of a final method that only throws CloneNotSupportedException. This version uses PMD's type resolution facilities, and can detect if the class implements or extends a Cloneable class.

This rule is defined by the following Java class:net.sourceforge.pmd.lang.java.typeresolution.rules.CloneMethodMustImplementCloneable

public class MyClass {
	public Object clone() throws CloneNotSupportedException {
		return foo;


Since: PMD 4.0

Avoid unused import statements. This rule will find unused on demand imports, i.e. import com.foo.*.

This rule is defined by the following Java class:net.sourceforge.pmd.lang.java.typeresolution.rules.imports.UnusedImports


import java.io.*;	// not referenced or required

public class Foo {}



Since: PMD 4.0

It is unclear which exceptions that can be thrown from the methods. It might be difficult to document and understand the vague interfaces. Use either a class derived from RuntimeException or a checked exception. JUnit classes are excluded.

This rule is defined by the following Java class:net.sourceforge.pmd.lang.java.typeresolution.rules.SignatureDeclareThrowsException

public void methodThrowingException() throws Exception {

This rule has the following properties:

Name Default Value Description
IgnoreJUnitCompletely false If true, all methods in a JUnit testcase may throw Exception