2016-05-13 98 views
0

标准春季启动应用程序有一些主要方法的类文件,说SampleApplication.java,看起来像这样:为什么主要的Spring Boot应用程序总是触发PMD的HideUtilityClassConstructorCheck?

@SpringBootApplication 
@RestController 
public class SampleApplication { 

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

} 

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

工具类 不应该有公共或默认的构造函数。

确保实用程序类(仅在其API中包含静态 方法或字段的类)没有公共构造函数。原理:实例化实用程序类没有意义。因此 构造函数应该是私有的或者(如果你想允许 子类)受保护。一个常见的错误是忘记隐藏 默认构造函数。

如果您构造的保护,你可能要考虑 下面的构造实现技术,以禁止 实例子类:

公共类StringUtils的//不是最终允许子类{保护 StringUtils的(){//防止来自子类的调用抛出新的 UnsupportedOperationException(); } public static int count(char c, String s){// ...}}

这是为什么?我应该抑制这个PMD错误吗?

回答

1

这次检查不言而喻。

默认情况下,任何代码检查器(IntelliJ IDEA,FindBugs,PMD,Sonar)都假定如果类只有static方法,那么它是utility class。实用类的实例为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 Boot应用程序的入口点)SampleApplication类有一个public static void main方法,所以PMD决定其实用类,检查私有构造和最终修饰符并标记错误。这不是问题,PMD根本不知道Spring Boot或其他框架及其入口点,因此,禁止此警告并将您的类从PMD中排除是非常合理的:对我而言,它的语义更加正确,比添加私有构造函数应用程序入口点。

相关问题