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:
//MethodDeclarator [@Image = 'clone'] [count(FormalParameters/*) = 0] [count(../Block//*[ (self::AllocationExpression) and (./ClassOrInterfaceType/@Image = ancestor:: ClassOrInterfaceDeclaration[1]/@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:
//MethodDeclaration [ MethodDeclarator/@Image = 'clone' and count(MethodDeclarator/FormalParameters/*) = 0 and count(NameList/Name[contains (@Image,'CloneNotSupportedException')]) = 0 ] [ ../../../../ClassOrInterfaceDeclaration[@Final = 'false'] ]
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 the Cloneable interface with the exception of a final method that only throws CloneNotSupportedException.
This rule is defined by the following XPath expression:
//ClassOrInterfaceDeclaration [not(./ImplementsList/ClassOrInterfaceType [@Image='Cloneable'])] /ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration [MethodDeclaration [MethodDeclarator[@Image = 'clone' and count(FormalParameters/*) = 0]] [not((../MethodDeclaration[@Final = 'true']) and Block[count(BlockStatement)=1] /BlockStatement/Statement/ThrowStatement/Expression /PrimaryExpression/PrimaryPrefix/AllocationExpression /ClassOrInterfaceType[@Image = 'CloneNotSupportedException'])]]
Here's an example of code that would trigger this rule:
public class MyClass { public Object clone() throws CloneNotSupportedException { return foo; } }