2016-09-09 5 views
4

私のプログラムには次のコードがあります.Mavenと統合した後、SonarQube 5をコード品質チェックに使用しています。SONARの不具合について囲みメソッドを静的にするか、このセットを削除する

しかし、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); 
} } 

答えて

5

。具体的には、ルールの説明の詳細など

「のインスタンスメソッドは、 『静的』フィールドに書き込むべきではありません」、ルールS2696について尋ねているように見える:

が正しく更新非静的メソッドのstaticフィールドは正しく動作するのが難しく、複数のクラスインスタンスや複数のスレッドがある場合、バグにつながる可能性があります。理想的には、staticフィールドはsynchronized staticメソッドからのみ更新されます。

すべてのクラスのインスタンス間で更新を行う、そのメソッドのコピーは1つだけstaticに存在するように、このように、問題はすなわち共有(、static(おそらくsetApplicationContext)それが提起された方法を作るためにあなたを語っていますすべてのクラスインスタンスにわたって)フィールドapplicationContext。さらに、メソッド​​を作成することにより、一度に1つのインスタンスしかメソッドを呼び出せないようにすることが推奨されます。

+1

いくつかのコンテキストを追加するには、静的でないsetApplicationContextメソッドがあると見なす開発者は、アプリケーションのすべてのインスタンスではなく、そのインスタンスのアプリケーションコンテキストのみを変更すると考えます。 – SJuan76

+2

静的にすることはできません。 ApplicationContextAwareの契約に違反するためです – anonymouse

関連する問題