2012-02-19 17 views
12

In Java, usiamo il blocco di inizializzazione statico:L'inizializzazione statica è una buona pratica di programmazione?

private static final ApiKey API_KEY; 

static { 
    API_KEY = new ApiKey(); 
} 

mi chiedevo che

  • E 'una buona pratica di programmazione?
  • Dove dovremmo usare questo modello?

Grazie in anticipo.

+1

io commento, perché non v'è alcuna risposta "bianco o nero" per la tua domanda. Personalmente, non trovo l'accessor statico un buon amico dei programmatori.L'iniezione di dipendenza è un'alternativa molto interessante che aiuta molto quando si tratta di test. –

+1

Ho visto un codice in cui sono stati avviati nuovi thread nel blocco statico. :) E 'stato molto brutto. –

risposta

9

In una certa misura è una questione di gusti. Per me va bene fino a quando:

  • Si mantiene la finale campo, come avete fatto
  • Fate che l'oggetto si fa riferimento è immutabile e thread-safe

Statica tendono a rendere la scrittura buoni test più difficili. Se dovessi trovare la necessità di iniziare a modificare lo stato statico, probabilmente dovrai rivedere il disegno.

Considerare lo Google Guice e il suo bellissimo Singleton implementation.

Ovviamente se la tua applicazione è un esperimento a 10 righe a una sola classe, questo è molto meno importante.

Si noti che nel tuo esempio, si potrebbe semplificare a:

private static final ApiKey API_KEY = new ApiKey(); 

che non è sempre possibile però. Forse hai omesso qualche codice di inizializzazione più complesso? Nel qual caso Guice meriterebbe ancora una volta un'occhiata.

3

Si potrebbe evitare di utilizzare completamente un blocco di inizializzazione statica utilizzando il seguente codice:

private static final ApiKey API_KEY = new ApiKey(); 

o

private static final ApiKey API_KEY = createNewApiKey(); 

se la creazione chiave API richiede più di una semplice chiamata al costruttore. Ciò rende il codice più leggibile, IMHO. Ma non importa molto.

L'inizializzatore statico è utile quando due campi statici dipendono stesso codice di inizializzazione:

static { 
    // compute some values 
    A = somePartOfTheComputedValues(); 
    B = someOtherPartOfTheComputedValues(); 
} 

Ma anche allora, A e B potrebbero eventualmente riscritta in un unico oggetto, che si verrebbe a creare in una singola metodo.

2

Mi piace usare le enumerazioni quando possibile.

Invece di

class ApiKey {   
    private static final ApiKey API_KEY; 

    static { 
     API_KEY = new ApiKey(); 
    } 

avrei scritto

enum ApiKey { 
    INSTANCE; 
Problemi correlati