web-dev-qa-db-ja.com

この「インスタンスメソッドから静的フィールドへの書き込み」findbugs警告を修正する最良の方法は何ですか?

これに似たクラスがあり、findbugzは「インスタンスメソッドから静的フィールドへの書き込み」(initialize()、およびkillStaticfield())について不平を言っています。 ctorで静的フィールドを設定できません。

  • この問題の最善の修正は何ですか?
  • StaticFieldをAtomicReferenceに配置するだけで十分でしょうか?

     public class Something
     {
      private static SomeClass staticField = null;
      private AnotherClass aClass;
      public Something()
      {
    
      }
    
      public void initialize()
      {
        //must be ctor'd in initialize
        aClass = new AnotherClass();
        staticField = new SomeClass( aClass );
      }
    
      public void killStaticField()
      {
       staticField = null;
      }
    
      public static void getStaticField()
      {
        return staticField;
      }
    }
    
17
darrickc

元のデザインにできるだけ近づける...

public class Something {
  private static volatile SomeClass staticField = null;

  public Something() {
  }

  public static SomeClass getStaticField() {
    if(Something.staticField == null)
      Something.staticField = new SomeClass();;
    return Something.staticField;
  }
}

クラス名を介して静的変数を参照すると、findbugz警告が削除されます。静的変数を揮発性としてマークします。これにより、マルチスレッド環境で参照がより安全になります。

さらに良いのは:

public class Something {
  private static final SomeClass staticField = new SomeClass();

  public Something() {
  }

  public static SomeClass getStaticField() {
    return Something.staticField;
  }
}
16
romacafe

問題は、静的フィールドで何をしたいのかということです。作成するクラスごとに変更される場合は、静的にすることはお勧めできません。一度だけ初期化される場合は、シングルトンとして遅延初期化する必要があります。

public class Something
{
    private static SomeClass staticField = null;

    public Something()
    {

    }

    public static SomeClass getStaticField()
    {
        if(staticField == null)
            staticField = new SomeClass();;
        return staticField;
    }
}
4
Daff

静的であってはならない場合は、staticFieldからstaticを削除します。

KillとgetStaticFieldを静的にします。また、静的を(暗黙の)thisではなくクラス名で参照して、静的であり、他のthReadで予期しない結果を引き起こす可能性があることを明確にします。

疑わしい場合は、非定数フィールドに統計を使用しないでください。

4
extraneon