Wednesday, September 28, 2011

PMD - Type Resolution Rules

This is the nineteenth installment of explanation of PMD rules covering Type Resolution Rules.

Type Resolution Rules

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

LooseCoupling

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

Example

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();
}
}

CloneMethodMustImplementCloneable

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

Example

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

UnusedImports

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

Example

// this is bad
import java.io.*;
public class Foo {}

SignatureDeclareThrowsException

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.

Example

public void methodThrowingException() throws Exception {
}

No comments: