##### Overview

- Download PMD 3.9
- What's new in PMD 3.9
- PMD in the news
- PMD-related products and books
- Best practices
- Future directions
- Similar projects
- Credits
- License
- What does 'PMD' mean?

##### Usage

- Installation
- Command line usage
- Ant task usage
- Maven plugin usage
- IDE plugin usage
- Suppressing warnings
- Finding duplicated code
- JSP support

##### Customizing PMD

- Compiling PMD
- How to write a rule
- Writing XPath rules
- How to make a rule set
- How it works

##### For example

- Run PMD on a Sourceforge project

##### Rule Sets

- Index
- Basic
- Braces
- Code Size
- Clone
- Controversial
- Coupling
- Design
- Finalizers
- Import Statements
- J2EE
- Javabeans
- JUnit Tests
- Logging (Java)
- Logging (Jakarta)
- Migrating
- Naming
- Optimizations
- Strict Exceptions
- Strings
- Sun Security
- Unused Code
- Java Server Pages
- Java Server Faces

##### Project Documentation

- About PMD
- Project Info
- Project Reports
- Development Process

## JavaBean Rules

The JavaBeans Ruleset catches instances of bean rules not being followed.

### BeanMembersShouldSerialize

If a class is a bean, or is referenced by a bean directly or indirectly it needs to be serializable. Member variables need to be marked as transient, static, or have accessor methods in the class. Marking variables as transient is the safest and easiest modification. Accessor methods should follow the Java naming conventions, i.e.if you have a variable foo, you should provide getFoo and setFoo methods.

This rule is defined by the following Java class: net.sourceforge.pmd.rules.BeanMembersShouldSerializeRule

Here's an example of code that would trigger this rule:

      private transient int someFoo;//good, it's transient
      private static int otherFoo;// also OK
      private int moreFoo;// OK, has proper accessors, see below
      private int badFoo;//bad, should be marked transient

      private void setMoreFoo(int moreFoo){
            this.moreFoo = moreFoo;
      }

      private int getMoreFoo(){
            return this.moreFoo;
      }

This rule has the following properties:

Name | Default value | Description
prefix |  | A variable prefix to skip, i.e., m_

### MissingSerialVersionUID

Classes that are serializable should provide a serialVersionUID field.

This rule is defined by the following XPath expression:

    //ClassOrInterfaceDeclaration
     [
      count(ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration
       /FieldDeclaration/VariableDeclarator/VariableDeclaratorId[@Image='serialVersionUID']) = 0
    and
      count(ImplementsList
       [ClassOrInterfaceType/@Image='Serializable'
       or ClassOrInterfaceType/@Image='java.io.Serializable']) =1
    ]

Here's an example of code that would trigger this rule:

    public class Foo implements java.io.Serializable {
     String name;
     // Define serialization id to avoid serialization related bugs
     // i.e., public static final long serialVersionUID = 4328743;
    }