首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >隐藏实用程序类构造函数:实用程序类不应具有公共或默认构造函数

隐藏实用程序类构造函数:实用程序类不应具有公共或默认构造函数
EN

Stack Overflow用户
提问于 2013-01-18 20:14:49
回答 9查看 163.3K关注 0票数 120

我在sonar上收到此警告。我希望解决方案删除声纳上的此警告。我的类是这样的:

代码语言:javascript
复制
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;       
    }
}

我想要适当的解决方案来消除声纳上的这个警告。

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2013-01-18 20:16:06

如果该类只是一个实用程序类,则应该使该类成为final并定义一个私有构造函数:

代码语言:javascript
复制
public final class FilePathHelper {

   private FilePathHelper() {
      //not called
   }
}

这可以防止在代码中的其他地方使用默认的无参数构造函数。此外,您可以将类设为final,这样它就不能在子类中扩展,这是实用程序类的最佳实践。由于您只声明了一个私有构造函数,其他类无论如何都不能扩展它,但将该类标记为final仍然是一个最佳实践。

票数 218
EN

Stack Overflow用户

发布于 2013-01-18 20:15:57

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

代码语言:javascript
复制
private FilePathHelper() {
    // No-op; won't be called
}

否则,Java编译器将提供一个公共的无参数构造函数,这是您实际上不想要的。

(您还应该将类设为final,尽管其他类无论如何都不能扩展它,因为它只有一个私有构造函数。)

票数 19
EN

Stack Overflow用户

发布于 2013-01-18 20:37:55

我使用不带实例的枚举

代码语言:javascript
复制
public enum MyUtils { 
    ; // no instances
    // class is final and the constructor is private

    public static int myUtilityMethod(int x) {
        return x * x;
    }
}

您可以使用以下命令调用此方法

代码语言:javascript
复制
int y = MyUtils.myUtilityMethod(5); // returns 25.
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14398747

复制
相关文章

相似问题

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