Clone Implementation Rules

The Clone Implementation ruleset contains a collection of rules that find questionable usages of the clone() method.

ProperCloneImplementation

Object clone() should be implemented with super.clone()

This rule is defined by the following XPath expression:

                 
//ClassOrInterfaceDeclaration//MethodDeclarator
[@Image = 'clone']
[count(FormalParameters/*) = 0]
[count(../Block//*[
    (self::AllocationExpression) and
    (./ClassOrInterfaceType/@Image = ancestor::
ClassOrInterfaceDeclaration[position()=last()]/@Image)
  ])> 0
]
                
             

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

			
 
class Foo{
    public Object clone(){
        return new Foo(); // This is bad
    }
}

     
		

CloneThrowsCloneNotSupportedException

The method clone() should throw a CloneNotSupportedException

This rule is defined by the following XPath expression:

                     
//ClassOrInterfaceDeclaration
[@Final = 'false']
[.//MethodDeclaration[
MethodDeclarator/@Image = 'clone'
and count(MethodDeclarator/FormalParameters/*) = 0
and count(NameList/Name[contains
(@Image,'CloneNotSupportedException')]) = 0]]
                     
                 

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

			
             
 public class MyClass implements Cloneable{
     public Object clone() // will cause an error {
          MyClass clone = (MyClass)super.clone();
          ...
          return clone;
     }
 }
    
         
		

CloneMethodMustImplementCloneable

The method clone() should only be implemented if the class implements Cloneable interface

This rule is defined by the following XPath expression:

                    
//ClassOrInterfaceDeclaration
[not(./ImplementsList/ClassOrInterfaceType
[@Image='Cloneable'])]
[.//MethodDeclaration/MethodDeclarator[@Image
= 'clone' and count(FormatParameters/*) = 0]]
                    
                

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

			
            
public class MyClass  {
   // will cause an error
   public Object clone() throws CloneNotSupportedException {
    ...
   }
}