私のプログラムには次のコードがあり、Mavenと統合した後、コードの品質チェックのためにSonarQube 5を実行しています。
ただし、Sonarは、包含メソッドを「静的」にするか、このセットを削除するように求めています。メソッドは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);
} }
具体的には、ルールS2696「インスタンスメソッドは「静的」フィールドに書き込むべきではない」について質問しているようです
ルールの説明の詳細として:
非静的メソッドから
static
フィールドを正しく更新するのは難しいため、複数のクラスインスタンスや複数のスレッドが実行されていると、バグが発生しやすくなります。理想的には、static
フィールドはsynchronized static
メソッドからのみ更新されます。
したがって、問題は、それが発生したメソッド(おそらくsetApplicationContext
)static
を作成するように指示しているため、すべてのクラスインスタンスにわたって、そのメソッドのコピーが1つだけあり、 static
(すべてのクラスインスタンスで共有)フィールドapplicationContext
。さらに、メソッドをsynchronized
にして、一度に1つのインスタンスのみがメソッドを呼び出せるようにすることをお勧めします。