2012-11-14 11 views
8

Ho una classe Java come questo:Scrivi nel campo statico: in questo caso FindBugs è errato?

public class Foo { 

    public static int counter = 0; 

    public void bar(int counter) { 
     Foo.counter = counter; 
    } 
} 

FindBugs mi avverte di scrivere al campo statico counter tramite il metodo di istanza bar. Tuttavia, se cambio il codice in:

public class Foo { 

    public static int counter = 0; 

    public static void setCounter(int counter) { 
     Foo.counter = counter; 
    } 

    public void bar(int counter) { 
     setCounter(counter); 
    } 
} 

Quindi FindBugs non si lamenterà. Non è sbagliato? Sto ancora scrivendo su un campo statico da un metodo di istanza, solo tramite un metodo statico, no?

+3

Fammi sapere quando diventano strumenti automatizzati in grado di rilevare tutti i tipi di bug di programmazione, in modo da poter cominciare a cercare una nuova carriera. – NullUserException

+0

Ma in questo caso è solo un tipo. : P Sono nuovo di quello strumento e non so ancora quanto siano affidabili i suoi risultati. :) – htorque

+1

Se FindBugs emette un avviso, è meglio esaminare il problema. Ma questo non significa che se FindBugs non emette alcun avviso, il codice è perfetto e privo di errori. –

risposta

13

Supponiamo che a un certo punto in futuro, si decida che questo metodo di impostazione deve essere protetto da thread e si desidera renderlo synchronized.

Questo codice funzionerà bene:

public synchronized static void setCounter(int counter) { 
    Foo.counter = counter; 
} 

public void bar(int counter) { 
    setCounter(counter); 
} 

Questo codice è sbagliato e dovrà comportamento non corretto:

public synchronized void bar(int counter) { 
    Foo.counter = counter; 
} 

Questo potrebbe non sembrare una differenza significativa in questo esempio forzato, soprattutto perché counter di solito può essere solo contrassegnato volatile. Tuttavia, in un esempio reale in cui il metodo setter ha una logica più complicata e viene chiamato da molti posti diversi (non solo da un metodo di istanza), quest'ultimo modello sarà più facile da refactoring.

Per inciso, a mio parere il plug-in Google's CodePro Analytix è uno strumento molto più veloce e completo di FindBugs.

correlati:

+0

CodePro AnalytiX funziona con 4.2 (Juno)? – erickson

+0

@erickson non sono sicuro ...la mia azienda utilizza una versione interna personalizzata di Eclipse, quindi non ho dovuto usare vaniglia Eclipse per un po '. – dbyrne

4

Dall'elenco FindBugs di bug descriptions:

ST: Scrivi a campo statico dal metodo di istanza (ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD)

Questo metodo di istanza scrive su un campo statico. È difficile ottenere il valore corretto se vengono manipolate più istanze e in genere è errata la pratica .

Non esiste una descrizione di bug simile per l'accesso a un campo statico tramite un metodo statico chiamato da un metodo di istanza.

Si consiglia di discutere le ragioni alla base di questa decisione sulla FindBugs mailing list