ti-enxame.com

Qual é a melhor maneira de corrigir esse aviso de 'localizar gravação no campo estático do método de instância'?

Eu tenho uma classe que se parece com isso, e o findbugz está reclamando da 'gravação no campo estático do método de instância' (initialize() e killStaticfield()). Não consigo definir o campo estático no ctor.

  • Qual é a melhor correção para esse problema?
  • Colocar staticField em um AtomicReference é suficiente?

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

Ficar o mais próximo possível do seu design original ...

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

Consulte sua variável estática pelo nome da classe, que removerá o aviso findbugz. Marque sua variável estática como volátil, o que tornará a referência mais segura em um ambiente multithread.

Melhor ainda seria:

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

  public Something() {
  }

  public static SomeClass getStaticField() {
    return Something.staticField;
  }
}
16
romacafe

A questão é o que você deseja fazer com o campo estático. Se ele mudar para cada classe que você criar, pode não ser uma boa ideia tê-lo estático. Se ele for inicializado apenas uma vez, você deve inicializá-lo lentamente como um singleton.

public class Something
{
    private static SomeClass staticField = null;

    public Something()
    {

    }

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

Remova a estática do staticField, caso não deva ser estática.

Faça kill e getStaticField estáticos. E você geralmente faz referência a estática pelo nome da classe, não por um (implícito) isso, para deixar bem claro que é estático e pode causar consequências inesperadas em outros tópicos.

Em caso de dúvida, não use estática para campos não constantes.

4
extraneon