Какой лучший способ исправить это предупреждение "write to static from from method"?

У меня есть класс, похожий на этот, и 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;
      }
    }
    

Ответ 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

Вопрос заключается в том, что вы хотите делать со статическим полем. Если он изменится для каждого класса, который вы создаете, может быть не совсем целесообразно, чтобы он был статичным вообще. Если он инициализируется только один раз, вы должны просто лениво инициализировать его как одиночный.

public class Something
{
    private static SomeClass staticField = null;

    public Something()
    {

    }

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

Ответ 3

Удалите статический файл из staticField, если он не должен быть статическим.

Сделайте сами kill и getStaticField. И вы обычно ссылаетесь на static по имени класса, а не на (неявное) это, чтобы четко указать, что он является статическим и может вызвать неожиданные последствия в других thReads.

Если вы сомневаетесь, не используйте статику для непостоянных полей.