metodo get statico e non statico get

2

Ho la seguente interfaccia.

public interface ValueInterface
{
  long  getValue();
}

E la classe:

public class ValueCreator implements ValueInterface
{
  private static long value  = 0;

  public void setValue(long valueInDollar)
  {
    value= valueInDollar;
  }

  @Override
  public long getValue()
  {
    return value;
  }
}

I findbug degli analizzatori di codici statici mi hanno avvertito di non impostare un campo statico in un metodo non statico. Se faccio il metodo set statico, non posso rendere statico il getter dato che è un metodo sovrascritto dall'interfaccia.

Quindi, va bene avere un setter statico e un getter non statico o quale potrebbe essere un approccio migliore?

    
posta Praveen Hassan 13.05.2014 - 09:13
fonte

2 risposte

3

No, non è una buona idea avere un getter non statico per un campo statico.

Il problema è che puoi avere più istanze di ValieCreator , ma condivideranno lo stesso campo value statico, quindi tutte le istanze restituiranno sempre lo stesso valore e se cambi il valore attraverso un'istanza, il la modifica è visibile in tutto.
Ciò è aggravato dal fatto che il getter è dichiarato nell'interfaccia ValueInterface . Supponiamo di avere questo codice:

void SillyMethod(ValueInterface i, ValueCreator c)
{
    if (i != c)
    {  // different objects
        long val = i.getValue();
        c.setValue(val+1);
        if (val != i.getValue())
        {
            // Huh? Setter on c changed the value on a different object?
        }
    }
}

È meglio rendere il campo value non statico. Se devi assicurarti che ci possa essere sempre solo un ValueCreator , allora puoi usare il modello Singleton per quello (ma prima assicurati che non ci sia nessuno scenario immaginabile dove potrebbero esserci due o più oggetti ValueCreator ).

    
risposta data 13.05.2014 - 09:33
fonte
0

FindBugs non trova effettivamente bug (o almeno non solo bug). Trova cose che sono strane. Quindi, se quello che vuoi veramente è avere quel valore statico e aver bisogno di implementare un'interfaccia che ottiene valore e dovrebbe restituire quel valore, non puoi fare diversamente dal metodo non statico che accede al campo statico. Se setter non è richiesto da quell'interfaccia, puoi usare setter statico o non statico, dipende da te. Ma il metodo non statico che lavora con dati statici è qualcosa di strano (non è sbagliato), quindi mi piacerebbe prefare il setter statico.

Sei sicuro di volere / aver bisogno che quel valore sia statico? (ma è per discussioni diverse)

    
risposta data 13.05.2014 - 09:30
fonte

Leggi altre domande sui tag