修复此“从实例方法写入静态字段”findbugs警告的最佳方法是什么?

2022-09-03 01:15:53

我有一个与此类似的类,findbugz抱怨“从实例方法写入静态字段”(和)。我无法在 ctor 中设置静态字段。initialize()killStaticfield()

  • 解决此问题的最佳方法是什么?
  • 将 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;
      }
    }
    

答案 1

尽可能接近您的原始设计...

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

答案 2

从 staticField 中删除 static 如果它不应该是 static 的。

使 kill 和 getStaticField 本身保持静态。你通常通过类名而不是(隐式)this来引用 static,以非常清楚地表明它是静态的,并且可能会在其他 thRead 中造成意想不到的后果。

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


推荐