Каков наилучший способ исправить это предупреждение о записи в статическое поле из метода экземпляра? - PullRequest
16 голосов
/ 02 сентября 2010

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

Ответы [ 3 ]

16 голосов
/ 03 сентября 2010

Пребывание как можно ближе к вашему первоначальному проекту ...

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, что сделает ссылку более безопасной в многопоточной среде.

Еще лучше было бы:

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

  public Something() {
  }

  public static SomeClass getStaticField() {
    return Something.staticField;
  }
}
4 голосов
/ 02 сентября 2010

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

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

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

4 голосов
/ 02 сентября 2010

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

public class Something
{
    private static SomeClass staticField = null;

    public Something()
    {

    }

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