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

我在Sonar上得到这个警告。我想要解决scheme在声呐上删除这个警告。 我的课是这样的:

public class FilePathHelper { private static String resourcesPath; public static String getFilePath(HttpServletRequest request) { if(resourcesPath == null) { String serverpath=request.getSession().getServletContext().getRealPath(""); resourcesPath = serverpath + "/WEB-INF/classes/"; } return resourcesPath; } } 

我想要适当的解决scheme,以消除声纳上的这个警告。

如果这个类只是一个工具类,你应该使类最终并定义一个私有的构造函数:

 public final class FilePathHelper { private FilePathHelper() { //not called } } 

这可以防止在代码中的其他地方使用默认的无参数构造函数。 此外,您可以使课程成为最终的,以便它不能在子类中扩展,这是实用程序类的最佳实践。 既然你只声明了一个私有的构造函数,其他类无法扩展它,但是把这个类标记为final是一个最好的习惯。

我不知道Sonar,但我怀疑它是在寻找一个私有的构造函数:

 private FilePathHelper() { // No-op; won't be called } 

否则,Java编译器将提供一个公共无参数的构造函数,你真的不想要。

(你也应该把它做成最终的,尽pipe其他类不能扩展它,因为它只有一个私有构造函数。)

我使用一个没有实例的枚举

 public enum MyUtils { ; // no instances // class is final and the constructor is private public static int myUtilityMethod(int x) { return x * x; } } 

你可以使用这个

 int y = MyUtils.myUtilityMethod(5); // returns 25. 

最好的做法是抛出一个错误,如果类构造。

例:

 /** * The Class FooUtilityService. */ final class FooUtilityService{ /** * Instantiates a new FooUtilityService. Private to prevent instantiation */ private FooUtilityService() { // Throw an exception if this ever *is* called throw new AssertionError("Instantiating utility class."); } 

添加私人构造函数:

 private FilePathHelper(){ super(); }