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

dar*_*ckc 17 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;
      }
    }
    
    Run Code Online (Sandbox Code Playgroud)

rom*_*afe 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;
  }
}
Run Code Online (Sandbox Code Playgroud)

通过类名称引用静态变量,这将删除findbugz警告.将静态变量标记为volatile,这将使多线程环境中的引用更安全.

更好的是:

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

  public Something() {
  }

  public static SomeClass getStaticField() {
    return Something.staticField;
  }
}
Run Code Online (Sandbox Code Playgroud)

  • +1,我最喜欢第二个甚至更好的版本. (2认同)

Daf*_*aff 6

问题是你想用静态字段做什么。如果您创建的每个类都发生变化,那么将其静态化可能根本不是一个好主意。如果它只初始化一次,那么您应该将其延迟初始化为单例。

public class Something
{
    private static SomeClass staticField = null;

    public Something()
    {

    }

    public static SomeClass getStaticField()
    {
        if(staticField == null)
            staticField = new SomeClass();;
        return staticField;
    }
}
Run Code Online (Sandbox Code Playgroud)