17

これに似たクラスがあり、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;
      }
    }
    
4

4 に答える 4

16

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

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;
  }
}
于 2010-09-02T20:30:50.117 に答える
4

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

public class Something
{
    private static SomeClass staticField = null;

    public Something()
    {

    }

    public static SomeClass getStaticField()
    {
        if(staticField == null)
            staticField = new SomeClass();;
        return staticField;
    }
}
于 2010-09-02T19:31:25.683 に答える
4

staticFieldを静的にすべきでない場合は、staticFieldからstaticを削除します。

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

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

于 2010-09-02T19:32:16.433 に答える
0

最善の方法は、それを行わないことです。より良いデザインのパターンを見つけてください。本当に必要な場合、これは機能し、findbugs/spotbugsが文句を言わないようにします。

public class Something
{
    private static SomeClass staticField = null;

    public Something()
    {
    }

    private void setStaticField(SomeClass value){
        staticField=value;
    } 

    public static SomeClass getStaticField()
    {
        if(staticField == null)
            setStaticField(new SomeClass());
        return staticField;
    }
}
于 2020-06-08T15:37:54.037 に答える