当前位置: 首页 > 知识库问答 >
问题:

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

公良浩邈
2023-03-14

标准的Spring Boot应用程序有一些主方法类文件,比如SampleApplication.java,看起来像这样:

@SpringBootApplication
@RestController
public class SampleApplication {

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

}

但PMD静态分析将其标记为错误(HideUtilityClassConstructorCheck):

实用程序类不应具有公共或默认构造函数。

确保实用程序类(在API中仅包含静态方法或字段的类)没有公共构造函数。

理由:实例化实用程序类没有意义。因此,构造函数应该是私有的,或者(如果您希望允许子类化)受保护的。一个常见的错误是忘记隐藏默认构造函数。

如果使构造函数受到保护,您可能需要考虑以下构造函数实现技术来禁止实例化子类:

公共类StringUtils//不是最终允许子类{受保护的StringUtils() { // 防止从子类调用抛出新的Un支持的操作异常();}公共静态int计数(char c, String s){//...###

为什么会这样?我应该抑制此PMD错误吗?

共有3个答案

史骏
2023-03-14

现在您可以像这样忽略注释@SpringBootApplication

<rule ref="category/java/design.xml/UseUtilityClass">
    <properties>
        <property name="ignoredAnnotations" value="org.springframework.boot.autoconfigure.SpringBootApplication"/>
    </properties>
</rule>

参见自PMD 6.16.0(2019年6月30日)起的UseUtilityClass

方飞白
2023-03-14

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

<rule ref="category/java/design.xml/UseUtilityClass">
    <properties>
        <property name="violationSuppressXPath" value="//ClassOrInterfaceDeclaration/preceding-sibling::Annotation/MarkerAnnotation/Name[@Image='SpringBootApplication']" />
    </properties>
</rule>
景书
2023-03-14

检查本身就说明了问题。

默认情况下,任何代码检查器(IntelliJ IDEA、FindBugs、PMD、Sonar)都假设如果类只有静态方法,那么它就是实用程序类。实用程序类的示例是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
}

此类类被设计为将其作为一包静态函数使用:为其声明私有构造函数是一种很好的做法,因此没有人会错误地实例化它并声明classfinal,因为扩展它毫无意义。

在您的情况下(以及Spring Boot应用程序的几乎每个入口点)SampleApplication类有一个public static void main方法,因此PMD决定其实用程序类,检查私有构造和最终修饰符,并标记错误。这不是问题所在,PMD只是不知道Spring Boot或任何其他框架及其入口点,所以最好不要显示此警告并将您的类从PMD中排除:对我来说,这比向应用程序入口点添加私有构造函数在语义上更正确。

 类似资料:
  • 这是我使用SpringBoot的第一天,我试图理解体系结构,因此我开始构建一个hello world应用程序: 在我的pom.xml中,在maven-shade-plugin下,我将mainClass声明如下: 文件目标是src/main/java/com/demo/helloworld.java,该文件中的代码是: 我错过了什么?

  • 这并不困难,但它让我质疑spring auth服务器是最好的选择,还是我应该使用Keycloak?

  • 我们正在运行java应用程序,该应用程序用作24/7运行的监控系统。我们有一些内存问题,所以我做了一个jmap转储,我可以分析它。在我使用live flag进行第二次转储之后,GC也在应用程序中运行,它的内存使用率再次降低(该进程现在运行了6个月)。所以我的问题是,如果在jmap转储之后,它可以执行GC,那么在此期间GC为什么不由进程本身运行,进程在此之后正常运行,并且它的内存使用情况正常? Op

  • 本文向大家介绍什么是 Java 程序的主类 应用程序和小程序的主类有何不同?相关面试题,主要包含被问及什么是 Java 程序的主类 应用程序和小程序的主类有何不同?时的应答技巧和注意事项,需要的朋友参考一下 一个程序中可以有多个类,但只能有一个类是主类。在 Java 应用程序中,这个主类是指包含 main()方法的类。而在 Java 小程序中,这个主类是一个继承自系统类 JApplet 或 App

  • 我有一个小的scala代码snipet: 当我在windows或mac上运行它时,它会打印出一个巨大的异常信息: 这是什么错误?我该如何修复它?我不太明白。谢谢!

  • 问题内容: Java是我选择的编程语言之一。尽管将应用程序分发给最终用户,但我总是遇到问题。 为用户提供JAR并不总是像我想要的那样友好,并且使用Java WebStart要求我维护Web服务器。 分发Java应用程序的最佳方法是什么?如果Java应用程序需要在用户计算机上安装工件,该怎么办?有没有好的Java安装/打包系统? 问题答案: 有多种解决方案,取决于你的发行要求。 只是用一个jar。这