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 the Cloneable interface
This rule is defined by the following XPath expression:
//ClassOrInterfaceDeclaration
[not(./ImplementsList/ClassOrInterfaceType
[@Image='Cloneable'])]
[.//MethodDeclaration/MethodDeclarator[@Image
= 'clone' and count(FormalParameters/*) = 0]]
Here's an example of code that would trigger this rule:
public class MyClass {
public Object clone() throws CloneNotSupportedException {
return foo;
}
}