Java 声纳抱怨制造封闭方法”;“静态”;或者移除这一组
我的程序中有下面的代码,在与Maven集成后,我正在运行SonarQube 5进行代码质量检查 然而,声纳要求将封闭方法设置为“静态”或移除这一组。方法是setApplicationContext 如何删除此错误?为什么会出现这种错误Java 声纳抱怨制造封闭方法”;“静态”;或者移除这一组,java,spring,performance,static,sonarqube,Java,Spring,Performance,Static,Sonarqube,我的程序中有下面的代码,在与Maven集成后,我正在运行SonarQube 5进行代码质量检查 然而,声纳要求将封闭方法设置为“静态”或移除这一组。方法是setApplicationContext 如何删除此错误?为什么会出现这种错误 public class SharedContext implements ApplicationContextAware { public static final String REPORT_ENGINE_FACTORY = "reportEngineFact
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);
} }
具体来说,您似乎在询问规则S2696,“实例方法不应写入“静态”字段” 如规则描述详细信息所示: 从非静态方法正确更新
静态
字段很难做到正确,如果存在多个类实例和/或多个线程,则很容易导致错误。理想情况下,静态
字段仅从同步静态
方法更新
因此,问题是告诉您使提出它的方法(可能是setApplicationContext
)static
,这样在所有类实例中,只有一个方法的副本更新static
(即在所有类实例中共享)字段applicationContext
。它还建议将方法同步化
,以便一次只有一个实例可以调用该方法
后期编辑:要查看规则说明,请单击问题消息后显示的“查看规则”或“…”(取决于您的SonarQube版本)。了解它的价值,我可能会因为这样说而被Sonar社区和Java世界列入黑名单,将
@SuppressWarnings(“squid:S2696”)
添加到违规方法的顶部会导致Sonar完全忽略该警告。这对我来说很有效
@Setter
private static volatile ApplicationContext context;
@Override
public void setApplicationContext(ApplicationContext ac) throws BeansException {
setContext(ac);
}
要添加一些上下文,任何开发人员如果看到您有一个非静态的
setApplicationContext
方法,都会认为它只会更改该实例的应用程序上下文,而不会更改应用程序的所有实例的应用程序上下文。您不能将其设置为静态。因为您将违反ApplicationContextawarRewhere的合同,您找到此规则描述了吗?请参阅我的扩展@Nick@ccellist,OP询问“如何删除此错误?为什么会出现此错误?”我想我已经相当彻底地回答了这两个问题。