2015-03-08 11 views
5

mi sono imbattuto in quanto segue:Sta usando un metodo statico vuoto in una classe che ha un inizializzatore statico accettabile/idiomatico?

class Foo { 

    static { 
    // setup for logging and configuration 
    } 

    public static void setup() { 
    // do nothing 
    } 

} 

È questo il codice Java idiomatica? Ci sono ragioni specifiche che dovrebbero essere evitate?

Questo è stato trovato in una suite di test.

La mia preoccupazione iniziale era che l'inizializzazione potrebbe teoricamente avvenire senza chiamare #setup().

+0

Bene, per esempio, impedisce alle sottoclassi di 'Foo' di avere la propria implementazione di' setup() '... Sarebbe interessante vedere cosa dicono i guru. – mazaneicha

+1

@mazaneicha Non c'è alcun problema con un 'Bar extends Foo {public static void setup() {...}}' – laune

+0

@mazaneicha no it –

risposta

-1

È questo codice Java idiomatico?

No.

Ci sono ragioni specifiche questo dovrebbe essere evitato?

Sì: è confuso, come evidenziato dai commenti a questa domanda.

La mia preoccupazione iniziale era che l'inizializzazione potrebbe teoricamente verificarsi senza chiamare #setup().

direi preoccupazione dell'autore è che l'inizializzazione potrebbe non accadere senza chiamare setup(). Il metodo setup() garantisce che l'inizializzatore statico abbia eseguito il suo "setup per la registrazione e la configurazione". Presumibilmente, ci sono effetti collaterali a questa configurazione che l'autore cerca di garantire chiamando il metodo vuoto.

0

Il codice che hai pubblicato è esattamente quello che ti piacerebbe incontrare? In JUnit, è prassi comune utilizzare un metodo statico annotato con @BeforeClass per configurare la classe di test e un metodo di istanza annotato con @Before per configurare ciascun test di unità.

(Ecco esempi del loro uso: http://examples.javacodegeeks.com/core-java/junit/junit-before-and-beforeclass-example/)

In caso contrario, sembra strano ...

+0

Vedere l'OP [commento] (http://stackoverflow.com/questions/28929588/is-using-an-empty-static-method-in-a-class-that-has-a-static-initializer-accepta/7117?noredirect = 1 # comment46115409_28929792) che indica lo scopo del metodo 'setup()' non fa parte di JUnit. – jaco0646

0

Non è sicuramente idiomatica, come si sta limitando quei metodi e blocchi statici di ereditare a sottoclassi . E sì, per lo scopo di inizializzazione non è necessario chiamare i metodi statici non appena vengono inizializzati al momento del caricamento della classe in JVM. E mentre si sta eseguendo, i blocchi statici sono i primi a essere eseguiti dall'alto verso il basso.

Problemi correlati