Merge branch 'addCloneMethodMustBePublicRule' of https://github.com/Monits/pmd into Monits-addCloneMethodMustBePublicRule
This commit is contained in:
@ -172,4 +172,49 @@ public class Foo implements Cloneable {
|
|||||||
]]>
|
]]>
|
||||||
</example>
|
</example>
|
||||||
</rule>
|
</rule>
|
||||||
|
|
||||||
|
<rule name="CloneMethodMustBePublic"
|
||||||
|
language="java"
|
||||||
|
since="5.4.0"
|
||||||
|
message="clone() method must be public if the class implements Cloneable"
|
||||||
|
class="net.sourceforge.pmd.lang.rule.XPathRule"
|
||||||
|
externalInfoUrl="${pmd.website.baseurl}/rules/java/clone.html#CloneMethodMustBePublic">
|
||||||
|
<description>
|
||||||
|
The java Manual says "By convention, classes that implement this interface should override
|
||||||
|
Object.clone (which is protected) with a public method."
|
||||||
|
</description>
|
||||||
|
<priority>3</priority>
|
||||||
|
<properties>
|
||||||
|
<property name="xpath">
|
||||||
|
<value>
|
||||||
|
<![CDATA[
|
||||||
|
//MethodDeclaration[@Public='false']
|
||||||
|
[
|
||||||
|
MethodDeclarator/@Image = 'clone'
|
||||||
|
and MethodDeclarator/FormalParameters/@ParameterCount = 0
|
||||||
|
]
|
||||||
|
]]>
|
||||||
|
</value>
|
||||||
|
</property>
|
||||||
|
</properties>
|
||||||
|
<example>
|
||||||
|
<![CDATA[
|
||||||
|
public class Foo implements Cloneable {
|
||||||
|
@Override
|
||||||
|
protected Object clone() throws CloneNotSupportedException { // Violation, must be public
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class Foo implements Cloneable {
|
||||||
|
@Override
|
||||||
|
protected Foo clone() { // Violation, must be public
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class Foo implements Cloneable {
|
||||||
|
@Override
|
||||||
|
public Object clone() // Ok
|
||||||
|
}
|
||||||
|
]]></example>
|
||||||
|
</rule>
|
||||||
</ruleset>
|
</ruleset>
|
@ -15,5 +15,6 @@ public class CloneRulesTest extends SimpleAggregatorTst {
|
|||||||
addRule(RULESET, "CloneThrowsCloneNotSupportedException");
|
addRule(RULESET, "CloneThrowsCloneNotSupportedException");
|
||||||
addRule(RULESET, "ProperCloneImplementation");
|
addRule(RULESET, "ProperCloneImplementation");
|
||||||
addRule(RULESET, "CloneMethodReturnTypeMustMatchClassName");
|
addRule(RULESET, "CloneMethodReturnTypeMustMatchClassName");
|
||||||
|
addRule(RULESET, "CloneMethodMustBePublic");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,110 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<test-data>
|
||||||
|
<test-code>
|
||||||
|
<description>
|
||||||
|
<![CDATA[
|
||||||
|
protected method clone
|
||||||
|
]]>
|
||||||
|
</description>
|
||||||
|
<expected-problems>1</expected-problems>
|
||||||
|
<code>
|
||||||
|
<![CDATA[
|
||||||
|
public class Foo implements Cloneable {
|
||||||
|
@Override
|
||||||
|
protected Object clone() throws CloneNotSupportedException {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]]>
|
||||||
|
</code>
|
||||||
|
</test-code>
|
||||||
|
|
||||||
|
<test-code>
|
||||||
|
<description>
|
||||||
|
<![CDATA[
|
||||||
|
protected method clone 2
|
||||||
|
]]>
|
||||||
|
</description>
|
||||||
|
<expected-problems>1</expected-problems>
|
||||||
|
<code>
|
||||||
|
<![CDATA[
|
||||||
|
public class Object implements Cloneable {
|
||||||
|
@Override
|
||||||
|
protected Object clone() {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]]>
|
||||||
|
</code>
|
||||||
|
</test-code>
|
||||||
|
|
||||||
|
<test-code>
|
||||||
|
<description>
|
||||||
|
<![CDATA[
|
||||||
|
public method clone
|
||||||
|
]]>
|
||||||
|
</description>
|
||||||
|
<expected-problems>0</expected-problems>
|
||||||
|
<code>
|
||||||
|
<![CDATA[
|
||||||
|
public class Foo implements Cloneable {
|
||||||
|
@Override
|
||||||
|
public Object clone() {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]]>
|
||||||
|
</code>
|
||||||
|
</test-code>
|
||||||
|
|
||||||
|
<test-code>
|
||||||
|
<description>
|
||||||
|
<![CDATA[
|
||||||
|
public method clone 2
|
||||||
|
]]>
|
||||||
|
</description>
|
||||||
|
<expected-problems>0</expected-problems>
|
||||||
|
<code>
|
||||||
|
<![CDATA[
|
||||||
|
public class Foo implements Cloneable {
|
||||||
|
@Override
|
||||||
|
public Foo clone() {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]]>
|
||||||
|
</code>
|
||||||
|
</test-code>
|
||||||
|
|
||||||
|
<test-code>
|
||||||
|
<description>
|
||||||
|
<![CDATA[
|
||||||
|
final class with protected clone method
|
||||||
|
]]>
|
||||||
|
</description>
|
||||||
|
<expected-problems>1</expected-problems>
|
||||||
|
<code>
|
||||||
|
<![CDATA[
|
||||||
|
public final class Foo implements Cloneable {
|
||||||
|
@Override
|
||||||
|
protected Object clone() {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]]>
|
||||||
|
</code>
|
||||||
|
</test-code>
|
||||||
|
|
||||||
|
<test-code>
|
||||||
|
<description>
|
||||||
|
<![CDATA[
|
||||||
|
final class with public method
|
||||||
|
]]>
|
||||||
|
</description>
|
||||||
|
<expected-problems>0</expected-problems>
|
||||||
|
<code>
|
||||||
|
<![CDATA[
|
||||||
|
public final class Foo implements Cloneable {
|
||||||
|
@Override
|
||||||
|
public Foo clone() {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]]>
|
||||||
|
</code>
|
||||||
|
</test-code>
|
||||||
|
</test-data>
|
Reference in New Issue
Block a user