web-dev-qa-db-ja.com

SONARは、囲んでいるメソッドを「静的」にするか、このセットを削除することについて不平を言います

私のプログラムには次のコードがあり、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);
} }
13
Awa

具体的には、ルールS2696「インスタンスメソッドは「静的」フィールドに書き込むべきではない」について質問しているようです

ルールの説明の詳細として:

非静的メソッドからstaticフィールドを正しく更新するのは難しいため、複数のクラスインスタンスや複数のスレッドが実行されていると、バグが発生しやすくなります。理想的には、staticフィールドはsynchronized staticメソッドからのみ更新されます。

したがって、問題は、それが発生したメソッド(おそらくsetApplicationContextstaticを作成するように指示しているため、すべてのクラスインスタンスにわたって、そのメソッドのコピーが1つだけあり、 static(すべてのクラスインスタンスで共有)フィールドapplicationContext。さらに、メソッドをsynchronizedにして、一度に1つのインスタンスのみがメソッドを呼び出せるようにすることをお勧めします。