Search code examples
javafindbugs

What's the best way to fix this 'write to static field from instance method' findbugs warning?


I have a class that looks similar to this, and findbugz is complaining about the 'write to the static field from the instance method' (initialize(), and killStaticfield()). I can't set the static field in the ctor.

  • What is the best fix for this issue?
  • Would putting staticField in an AtomicReference suffice?

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

Solution

  • Staying as close as possible to your original design...

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

    Refer to your static variable via the class name, that will remove the findbugz warning. Mark your static variable as volatile, which will make the reference safer in a multithreaded environment.

    Even better would be:

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