The Clone Implementation ruleset contains a collection of rules that find questionable usages of the clone() method.
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 } }
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; } }
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 { ... } }