解决这个'从实例方法写入静态字段'findbugs警告的最佳方法是什么?

时间:2010-09-02 19:26:05

标签: java 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;
      }
    }
    

4 个答案:

答案 0 :(得分: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警告。 将静态变量标记为volatile,这将使参考在多线程环境中更安全。

更好的是:

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

  public Something() {
  }

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

答案 1 :(得分:4)

问题是你想用静态字段做什么。如果它对你创建的每个类都有所改变,那么将它静态化可能不是一个好主意。如果它只被初始化一次你应该懒得将其初始化为单身。

public class Something
{
    private static SomeClass staticField = null;

    public Something()
    {

    }

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

答案 2 :(得分:4)

如果static不是静态的,请从staticField中删除静态。

自己制作kill和getStaticField。并且你通常通过类名引用静态,而不是通过(隐式)引用静态,以明确它是静态的并且可能在其他thReads中引起意外后果。

如有疑问,请勿对非常数字段使用静态。

答案 3 :(得分:0)

最好的方法是不要这样做,尝试找到更好的设计模式。 如果确实有必要,这将起作用,并且不会使findbug / spotbug抱怨。

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;
    }
}