2012-07-23 15 views
9

Una variabile statica può essere inizializzata con i metodi statici privati ​​o con un blocco statico. C'è qualche sottile differenza tra i due? Ci sono situazioni in cui non posso usare il metodo statico per inizializzare membri statici? Ho trovato il dopo più leggibile.blocco statico rispetto al metodo statico privato per l'inizializzazione dei membri statici

statico blocco di inizializzazione:

private static int NUM_ITER; 
static { 
    // Operations 
    NUM_ITER = //val from above operations. 
} 

privato statico metodo di inizializzazione:

private static int NUM_ITER = calculateNumIter(); 

// Some method comment on how we are calculating. 
private static int calculateNumIter() 
{ 
    // Operations. 
    return //value_from_operations. 
} 

io preferisco il secondo dal momento che è più leggibile. Ci sono situazioni che devo usare solo per prime (blocchi statici)?

Qual è la migliore convenzione/progettazione di codifica per l'inizializzazione di membri statici (finale e variabile)? Anche da questo thread ho imparato che i metodi statici privati ​​hanno un vantaggio rispetto ai blocchi statici.

grazie,

+0

Ho dimenticato la statica alcune volte per il blocco statico, da quando uso la versione 2;). – Stefan

risposta

2

sarebbe necessario (o almeno utili) Il blocco statico se due variabili diverse sono interdipendenti e non possono essere inizializzate indipendentemente.

Supponiamo che sia necessario leggere due valori da un file, ad esempio. È possibile memorizzare entrambi i valori in un oggetto aggiuntivo. Ma se vuoi veramente due costanti, è utile un blocco statico.

+0

Quindi, anche qui il metodo statico può sostituire il blocco statico. – Mohan

+0

Che funziona se il secondo è derivato dal primo. Ma se entrambi derivano da un singolo valore, non lo è. Supponiamo di aver bisogno di leggere due valori da un file, per esempio. –

+1

Sì, ma cosa succede se il tuo primo metodo statico accetta anche il tuo secondo membro statico come arg? – LastStar007

1
  1. static Initializer blocco (L'opzione 1) viene eseguito quando la JVM carica la classe, anche prima di qualsiasi variabile static viene inizializzata.

  2. È un buon posto per avere tutte le variabili statiche in una volta.

  3. La seconda opzione può essere opzionalmente utilizzato per inizializzare multiplistatic variabili passando più argomenti al parametro del metodo di inizializzazione.

+0

Nel mio esempio, il calcoloNumIter() verrà chiamato durante l'inizializzazione JVM. Non è vero? – Mohan

+0

Ya lo farà ...... –

2

Vorrei suggerire di utilizzare qualsiasi sintassi mantiene il vostro codice pulito e leggibile:

  • se gli importi di inizializzazione a uno, massimo due, molto semplici righe di codice, poi andare con il blocco statico ;

  • se l'inizializzazione è un'operazione complessa, quindi un metodo con un buon nome sarà il migliore;

  • In dubbio, utilizzare la sintassi del metodo e utilizzare il nome del metodo per dichiarare non solo quale variabile, ma anche come si sta inizializzando (ad esempio initializeValueWithRandomNumber());

Problemi correlati