标准Spring应用程序有一些主方法类文件,比如SampleApplication.java,如下所示:
@SpringBootApplication
@RestController
public class SampleApplication {
public static void main(final String[] args) {
SpringApplication.run(SampleApplication.class, args);
}
}但是PMD静态分析将其标记为错误(HideUtilityClassConstructorCheck):
实用工具类不应具有公共或默认构造函数。 确保实用程序类(仅包含其API中的静态方法或字段的类)没有公共构造函数。 原理:实例化实用程序类是没有意义的。因此,构造函数应该是私有的,或者(如果您希望允许子类)受保护。一个常见的错误是忘记隐藏默认构造函数。 如果使构造函数受到保护,则可能需要考虑以下构造函数实现技术,以不允许实例化子类: 公共类StringUtils // not允许子类{受保护的StringUtils() { //阻止来自子类的调用抛出新的UnsupportedOperationException();}公共静态int计数(char,String s) { // .}}
为什么会这样呢?我应该抑制这个PMD错误吗?
发布于 2016-05-13 22:28:09
这次检查本身就说明了问题。
默认情况下,任何代码检查器(IntelliJ IDEA、FindBugs、PMD、Sonar)都假定,如果类只有static方法,那么它就是效用类。实用工具类的示例是java.lang.Math,它如下所示:
public final class Math {
/**
* Don't let anyone instantiate this class.
*/
private Math() {}
public static double exp(double a) {
...
}
// More helper methods
}这样的类是为了将它作为一个静态函数包使用而设计的:为它声明私有构造函数是一个很好的实践,所以没有人会错误地实例化它并声明类final,因为扩展它是没有意义的。
在您的示例中(以及Spring应用程序的几乎每个入口点),SampleApplication类都有一个public static void main方法,因此PMD决定它的实用程序类,检查私有结构和最终修饰符,并标记错误。这不是问题所在,PMD只是不知道Spring或任何其他框架及其入口点,所以完全有理由禁止这个警告并将类排除在PMD之外:对我来说,它比向应用程序入口点添加私有构造函数更正确。
发布于 2018-09-17 21:09:00
仅对于具有@SpringBootApplication注释的类,可以在PMD规则集XML文件中使用以下代码片段来抑制PMD @SpringBootApplication规则:
<rule ref="category/java/design.xml/UseUtilityClass">
<properties>
<property name="violationSuppressXPath" value="//ClassOrInterfaceDeclaration/preceding-sibling::Annotation/MarkerAnnotation/Name[@Image='SpringBootApplication']" />
</properties>
</rule>发布于 2020-02-21 10:29:15
您可以使用@SuppressWarnings("PMD")在入口点禁止警告,因为Spring使用基于反射和PMD分析器无法分析的其他内容的面向方面的编程。不要担心在这个类中压制警告
对埃克森人来说:
@SuppressWarnings("PMD")
@SpringBootApplication(exclude = SecurityAutoConfiguration.class)
@EnableScheduling
@EnableConfigurationProperties
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}您可以在这里阅读更多内容:warnings.html
https://stackoverflow.com/questions/37219469
复制相似问题