从实例方法’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; } } 

保持尽可能接近原始设计……

 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,这将使multithreading环境中的引用更安全。

更好的是:

 public class Something { private static final SomeClass staticField = new SomeClass(); public Something() { } public static SomeClass getStaticField() { return Something.staticField; } } 

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

自己使kill和getStaticField静态。 并且您通常通过类名引用静态,而不是通过(隐式)引用静态,以非常清楚它是静态的并且可能在其他thReads中导致意外后果。

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

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

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