首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么主Spring应用程序总是触发PMD的HideUtilityClassConstructorCheck?

为什么主Spring应用程序总是触发PMD的HideUtilityClassConstructorCheck?
EN

Stack Overflow用户
提问于 2016-05-13 21:17:33
回答 4查看 7.3K关注 0票数 9

标准Spring应用程序有一些主方法类文件,比如SampleApplication.java,如下所示:

代码语言:javascript
复制
@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错误吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-05-13 22:28:09

这次检查本身就说明了问题。

默认情况下,任何代码检查器(IntelliJ IDEA、FindBugs、PMD、Sonar)都假定,如果类只有static方法,那么它就是效用类。实用工具类的示例是java.lang.Math,它如下所示:

代码语言:javascript
复制
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之外:对我来说,它比向应用程序入口点添加私有构造函数更正确。

票数 5
EN

Stack Overflow用户

发布于 2018-09-17 21:09:00

仅对于具有@SpringBootApplication注释的类,可以在PMD规则集XML文件中使用以下代码片段来抑制PMD @SpringBootApplication规则:

代码语言:javascript
复制
<rule ref="category/java/design.xml/UseUtilityClass">
    <properties>
        <property name="violationSuppressXPath" value="//ClassOrInterfaceDeclaration/preceding-sibling::Annotation/MarkerAnnotation/Name[@Image='SpringBootApplication']" />
    </properties>
</rule>
票数 3
EN

Stack Overflow用户

发布于 2020-02-21 10:29:15

您可以使用@SuppressWarnings("PMD")在入口点禁止警告,因为Spring使用基于反射和PMD分析器无法分析的其他内容的面向方面的编程。不要担心在这个类中压制警告

对埃克森人来说:

代码语言:javascript
复制
@SuppressWarnings("PMD")
@SpringBootApplication(exclude = SecurityAutoConfiguration.class)
@EnableScheduling
@EnableConfigurationProperties
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

您可以在这里阅读更多内容:warnings.html

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37219469

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档