Java - SonarQube,关于“实用程序类不应有公共构造函数”(squid:S1118)的问题

Posted

技术标签:

【中文标题】Java - SonarQube,关于“实用程序类不应有公共构造函数”(squid:S1118)的问题【英文标题】:Java - SonarQube, issue on 'Utility classes should not have public constructors' (squid:S1118) in singleton 【发布时间】:2017-11-19 08:58:24 【问题描述】:

我正在使用 SonarLint 分析对旧代码执行静态代码分析。我无法在此处粘贴代码,但类似于:

@SuppressWarnings("static-access")
public class SuperClass 

    private SuperClass() 
    

    public static SuperClass getInstance() 
        return InstanceHolder.instance;
    

    private static class InstanceHolder 
        public final static SuperClass instance = new SuperClass();
    

    public void doSomething() 
        //do something
    


SonarQube (sonar-java: 4.2.1.6971),在S1118 上报告了一个问题。

InstanceHolder 中添加私有构造函数在这里没有解决效果,因为SuperClass 是唯一可以创建它的实例的类,因为它的私有修饰符。

SuperClass 仍然可以创建实例,即使 ÌnstanceHolder 具有私有构造函数。

顺便说一句:添加构造函数消除了声纳问题,所以我认为分析器将其标记为违反规则,因为内部“UtilityClass”没有进一步调查。

这是一个错误吗?这不是设计缺陷,而是线程安全单例的示例。

【问题讨论】:

您的代码与您的错误消息不匹配。错误消息指出 InstanceHolder 不需要私有构造函数(这是真的),但在您的代码中 InstanceHolder 中没有私有构造函数。 ´添加一个私有构造函数来隐藏隐式的公共构造函数。´是声纳所说的。添加构造函数没有任何效果。除了 SuperClass 没有人可以创建实例,SuperClass 仍然可以。 对不起,我误会了你。 Sonar 想让你给InstanceHolder 添加一个私有构造函数?我认为这是声纳的一个错误。 是的,这是 SonarQube 分析器的一个错误或者说是一个限制。我将这些问题标记为Resolve as won't fix,因为私有构造函数不会产生任何影响 该问题现已在jira.sonarsource.com/browse/SONARJAVA-2562中得到解决 【参考方案1】:

使您的类成为最终类,这样就可以避免创建实例。

    @SuppressWarnings("static-access")
    public final class SuperClass 

        private SuperClass() 
        
    

【讨论】:

以上是关于Java - SonarQube,关于“实用程序类不应有公共构造函数”(squid:S1118)的问题的主要内容,如果未能解决你的问题,请参考以下文章

java 有用的Java实用程序类或方法。

java 实用程序类代码段

SonarQube 9.x与Jenkins进行集成并扫描后端java以及前端vue代码;

java 使用RecyclerView小部件实现加载更多功能的实用程序类。

java 一个实用程序类,它使用各种方法来确定两个字符串之间的相似性。

java 一个实用程序类,它帮助我仅使用包含和排除来创建复杂的正则表达式路径。