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)的问题的主要内容,如果未能解决你的问题,请参考以下文章
SonarQube 9.x与Jenkins进行集成并扫描后端java以及前端vue代码;
java 使用RecyclerView小部件实现加载更多功能的实用程序类。