2016-05-13 58 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中排除是非常合理的:對我而言,它的語義更加正確,比添加私有構造函數應用程序入口點。

相關問題