我正在使用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
}
}
Run Code Online (Sandbox Code Playgroud)
SonarQube(sonar-java:4.2.1.6971)报告了S1118的一个问题.
添加私有构造函数在InstanceHolder这里没有解决效果,因为SuperClass它是唯一可以由于其私有修饰符而创建它的实例的类.
SuperClass即使拥有ÌnstanceHolder私有构造函数,仍然可以创建一个实例.
BTW:添加构造函数会删除声纳问题,所以我认为分析器将此标记为规则违规,因为内部的"UtilityClass"没有进一步调查.
这是一个错误吗?这是一个线程安全单例的例子,而不是设计缺陷.
我可能会错过一些东西,但是声明了LinkedHashmap:
private final LinkedHashMap<anEnum, anInteger> linkedHashMap;
Run Code Online (Sandbox Code Playgroud)
然后:
linkedHashMap = new LinkedHashMap<anEnum, anInteger>();
Run Code Online (Sandbox Code Playgroud)
结果是:
"使用枚举值的键映射应替换为EnumMap"(SQUID:1640)
由于没有"LinkedEnumMap",因此应忽略此声明.