Merge branch 'constant-interface' of https://github.com/Monits/pmd into Monits-constant-interface

This commit is contained in:
Andreas Dangel
2016-05-21 12:07:12 +02:00
3 changed files with 92 additions and 0 deletions

View File

@ -1949,4 +1949,50 @@ public final class Foo {
</example>
</rule>
<rule name="ConstantsInInterface"
language="java"
since="5.5"
message="Avoid constants in interfaces. Interfaces define types, constants are implementation details better placed in classes or enums. See Effective Java, item 19."
class="net.sourceforge.pmd.lang.rule.XPathRule"
externalInfoUrl="${pmd.website.baseurl}/rules/java/design.html#ConstantsInInterface">
<description>
Avoid constants in interfaces. Interfaces should define types, constants are implementation details
better placed in classes or enums. See Effective Java, item 19.
</description>
<priority>3</priority>
<properties>
<property name="ignoreIfHasMethods" type="Boolean" description="Whether to ignore constants in interfaces if the interface defines any methods" value="true"/>
<property name="xpath">
<value>
<![CDATA[
//ClassOrInterfaceDeclaration[@Interface='true'][$ignoreIfHasMethods='false' or not(.//MethodDeclaration)]//FieldDeclaration
]]>
</value>
</property>
</properties>
<example>
<![CDATA[
public interface ConstantInterface {
public static final int CONST1 = 1; // violation, no fields allowed in interface!
static final int CONST2 = 1; // violation, no fields allowed in interface!
final int CONST3 = 1; // violation, no fields allowed in interface!
int CONST4 = 1; // violation, no fields allowed in interface!
}
// with ignoreIfHasMethods = false
public interface AnotherConstantInterface {
public static final int CONST1 = 1; // violation, no fields allowed in interface!
int anyMethod();
}
// with ignoreIfHasMethods = true
public interface YetAnotherConstantInterface {
public static final int CONST1 = 1; // no violation
int anyMethod();
}
]]>
</example>
</rule>
</ruleset>

View File

@ -73,5 +73,6 @@ public class DesignRulesTest extends SimpleAggregatorTst {
addRule(RULESET, "UseNotifyAllInsteadOfNotify");
addRule(RULESET, "UseUtilityClass");
addRule(RULESET, "UseVarargs");
addRule(RULESET, "ConstantsInInterface");
}
}

View File

@ -0,0 +1,45 @@
<?xml version="1.0" encoding="UTF-8"?>
<test-data>
<test-code>
<description><![CDATA[
constants in interface, no methods
]]></description>
<expected-problems>4</expected-problems>
<code><![CDATA[
public interface Foo {
public static final int CONST1 = 1;
static final int CONST2 = 1;
final int CONST3 = 1;
int CONST4 = 1;
}
]]></code>
</test-code>
<test-code>
<description><![CDATA[
constants in interface, with methods, ignoreIfHasMethods is false
]]></description>
<rule-property name="ignoreIfHasMethods">false</rule-property>
<expected-problems>1</expected-problems>
<code><![CDATA[
public interface AnotherConstantInterface {
public static final int CONST1 = 1;
int anyMethod();
}
]]></code>
</test-code>
<test-code>
<description><![CDATA[
constants in interface, with methods, ignoreIfHasMethods is true
]]></description>
<rule-property name="ignoreIfHasMethods">true</rule-property>
<expected-problems>0</expected-problems>
<code><![CDATA[
public interface AnotherConstantInterface {
public static final int CONST1 = 1;
int anyMethod();
}
]]></code>
</test-code>
</test-data>