我正在使用 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 上报告了一个问题.
将私有(private)构造函数添加到
InstanceHolder
这里没有解决效果,因为 SuperClass
由于其私有(private)修饰符,是唯一可以创建它的实例的类。SuperClass
仍然可以创建实例,即使使用 ÌnstanceHolder
有一个私有(private)构造函数。顺便说一句:添加构造函数消除了 Sonar 问题,所以我认为分析器将其标记为违反规则,因为内部“UtilityClass”没有进一步调查。
这是一个错误吗?这不是设计缺陷,而是线程安全单例的示例。
最佳答案
使您的类(class)成为 final类,以便避免创建实例。
@SuppressWarnings("static-access")
public final class SuperClass {
private SuperClass() {
}
}
关于Java - SonarQube,在 'Utility classes should not have public constructors' 上发布(squid :S1118) in singleton,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44591666/