diff --git a/docs/pages/release_notes.md b/docs/pages/release_notes.md index 04dba9e76b..d92379bfaa 100644 --- a/docs/pages/release_notes.md +++ b/docs/pages/release_notes.md @@ -171,6 +171,7 @@ All existing rules have been updated to reflect these changes. If you have custo * java-design * [#357](https://github.com/pmd/pmd/issues/357): \[java] UncommentedEmptyConstructor consider annotations on Constructor * [#438](https://github.com/pmd/pmd/issues/438): \[java] Relax AbstractClassWithoutAnyMethod when class is annotated by @AutoValue + * [#590](https://github.com/pmd/pmd/issues/590): \[java] False positive on MissingStaticMethodInNonInstantiatableClass * java-sunsecure * [#468](https://github.com/pmd/pmd/issues/468): \[java] ArrayIsStoredDirectly false positive * java-unusedcode diff --git a/pmd-java/src/main/resources/rulesets/java/design.xml b/pmd-java/src/main/resources/rulesets/java/design.xml index 6cc41185bd..31839ccf57 100644 --- a/pmd-java/src/main/resources/rulesets/java/design.xml +++ b/pmd-java/src/main/resources/rulesets/java/design.xml @@ -817,41 +817,26 @@ A class that has private constructors and does not have any static methods or fi //ClassOrInterfaceDeclaration[@Nested='false'] [ ( - count(./ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/ConstructorDeclaration)>0 + ./ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/ConstructorDeclaration and count(./ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/ConstructorDeclaration) = count(./ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/ConstructorDeclaration[@Private='true']) ) and - count(.//MethodDeclaration[@Static='true'])=0 + not(.//MethodDeclaration[@Static='true']) and - count(.//FieldDeclaration[@Private='false'][@Static='true'])=0 + not(.//FieldDeclaration[@Private='false'][@Static='true']) and - count(.//ClassOrInterfaceDeclaration[@Nested='true'] + not(.//ClassOrInterfaceDeclaration[@Nested='true'] [@Public='true'] [@Static='true'] - [count(./ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/ConstructorDeclaration[@Public='true']) > 0] - [count(./ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/MethodDeclaration - [@Public='true'] - [./ResultType/Type/ReferenceType/ClassOrInterfaceType - [@Image = //ClassOrInterfaceDeclaration[@Nested='false']/@Image] - ] - ) > 0] - ) = 0 - and - count(//ClassOrInterfaceDeclaration - [@Nested='true'] - [@Static='true'] - [@Public='true'] - [.//MethodDeclaration - [@Public='true'] - [.//ReturnStatement//AllocationExpression - [ClassOrInterfaceType - [@Image = //ClassOrInterfaceDeclaration/@Image] + [not(./ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/ConstructorDeclaration) or ./ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/ConstructorDeclaration[@Public='true']] + [./ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/MethodDeclaration + [@Public='true'] + [./ResultType/Type/ReferenceType/ClassOrInterfaceType + [@Image = //ClassOrInterfaceDeclaration[@Nested='false']/@Image] ] - [./Arguments//PrimaryPrefix/@ThisModifier='true'] - ] ] - ) = 0 + ) ] ]]> diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/design/xml/MissingStaticMethodInNonInstantiatableClass.xml b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/design/xml/MissingStaticMethodInNonInstantiatableClass.xml index 53b5a30ae3..f2e9aa52f9 100644 --- a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/design/xml/MissingStaticMethodInNonInstantiatableClass.xml +++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/design/xml/MissingStaticMethodInNonInstantiatableClass.xml @@ -209,6 +209,38 @@ public final class BacklogElementParameters { return new BacklogElementParameters(this); } } +} + ]]> + + + + #590 Check Builder pattern alternative + 0 +