The JavaBeans Ruleset catches instances of bean rules not being followed.
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, marked as 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; }
Classes that are serializable should provide a serialVersionUID field.
This rule is defined by the following XPath expression:
//TypeDeclaration[ //ClassOrInterfaceDeclaration/ImplementsList[ClassOrInterfaceType/@Image=("Serializable" or "java.io.Serializable")] and not( //ClassOrInterfaceBodyDeclaration/FieldDeclaration[VariableDeclarator/VariableDeclaratorId/@Image='serialVersionUID'] )
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 public static final long serialVersionUID = 4328743; }