SONAR抱怨做出封闭的方法"静态"或删除此设置

时间:2016-09-09 09:06:04

标签: java spring performance static sonarqube

我的程序中有以下代码,在与Maven集成后,我正在运行SonarQube 5进行代码质量检查。

然而,声纳要求制作封闭方法"静态"或删除此设置。方法是setApplicationContext。

如何删除此错误?为什么会出现这个错误?

public class SharedContext implements ApplicationContextAware {
public static final String REPORT_ENGINE_FACTORY = "reportEngineFactory";
private static ApplicationContext applicationContext;

public void setApplicationContext(ApplicationContext applicationContext)
        throws BeansException {
    SharedContext.applicationContext = applicationContext;
}

public static ApplicationContext getApplicationContext() {
    return applicationContext;
}

public Object getBean(String name) {
    return applicationContext.getBean(name);
} }

3 个答案:

答案 0 :(得分:7)

具体而言,您似乎在询问规则S2696,'实例方法不应写入"静态"字段'

正如规则描述详述:

  

正确地从非静态方法更新static字段很难做到正确,如果有多个类实例和/或多个线程在运行,很容易导致错误。理想情况下,static字段仅从synchronized static方法更新。

因此,问题在于告诉您创建它所引发的方法(大概是setApplicationContextstatic,以便在所有类实例中只有一个副本的方法进行更新static(即在所有类实例中共享)字段applicationContext。它还建议使用方法synchronized,以便一次只能调用一个实例。

答案 1 :(得分:1)

对于它的价值,我可能会因此特别地被Sonar社区和Java Universe列入黑名单,因为在冒犯性方法的顶部添加@SuppressWarnings("squid:S2696")导致Sonar忽略了这一点完全警告。

答案 2 :(得分:0)

这对我有用。

@Setter
private static volatile ApplicationContext context;

@Override
public void setApplicationContext(ApplicationContext ac) throws BeansException {
    setContext(ac);
}