2013-03-06 28 views
5

Perché dovrei utilizzare il blocco di inizializzazione statico quando posso inizializzare i membri statici tramite un costruttore?Perché dovrei usare il blocco di inizializzazione statico in java?

+8

Cosa succede se non si ha un'istanza di tale classe - ma si desidera utilizzare le funzioni statiche di esso, che utilizza i valori inizializzati dal blocco di inizializzazione statico? – ppeterka

+1

e ogni volta che viene chiamato c'tor, i valori statici verranno ripristinati. cattivo!! – Azodious

risposta

3

In primo luogo, potresti non avere mai istanze della tua classe. Oppure potresti voler avere i membri statici inializzati prima di se hai qualche istanza della classe.

In secondo luogo, l'inizializzazione membri statici da costruttori è più lavoro:

  • è necessario fare in modo che ogni costruttore fa questo;
  • è necessario mantenere un flag per tenere traccia di se i membri statici sono stati inizializzati;
  • devi pensare alla sincronizzazione per evitare condizioni di gara;
  • potrebbe essere necessario prendere in considerazione le implicazioni di prestazioni della sincronizzazione, soprattutto se si hanno molti thread che creano molte istanze della classe.

Infine, di solito è la cosa sbagliata da fare concettualmente (dico "di solito" perché ci sono usi legittimi per l'inizializzazione pigra).

+0

+1 - sebbene se si intendesse implementare l'inizializzazione lazy (o non pigro differito), probabilmente non si "accadrà" in un costruttore. –

1

Un membro statico non è associato a nessuna istanza della classe, mentre il costruttore crea un'istanza. È possibile utilizzare membri statici senza avere una singola istanza della classe, dovranno comunque essere inizializzati. In questo caso un costruttore non può fare il lavoro.

0

Allora perché:

static Set<String> digits = new HashSet<String>(); 
static { 
    Collections.add(digits, "unu", "du", "tri", "kvar", "kvin"); 
    digits.add("ses"); 
    digits.add("sep"); 
    digits.add("ok"); 
} 

se ciò che segue è possibile:

static Set<String> digits = new HashSet<String>() {{ 
    Collections.add(this, "unu", "du", "tri", "kvar", "kvin"); 
    add("ses"); 
    add("sep"); 
    add("ok"); 
}}; 
  1. introduce una nuova classe anonima, un file nel vaso; non così ottimale.
  2. La seconda forma è una cosa da gioco geek.
+0

perché l'introduzione di nuove classi anonime non è ottimale? porterebbe mai a classloadare bug? o stai solo dicendo che non vuoi gonfiare il tuo barattolo. –

+1

@DavidT. Non ho antipatia per nessuna delle due forme, ma le ho confrontate entrambe: la prima ha occorrenze ridondanti di 'cifre 'e la seconda crea una classe anymous (minuscolo sovraccarico) e ha una sintassi fuorviante per gli sviluppatori non java. Il vero pericolo sarebbe quando si utilizza un '{{...}}' non statico su una classe Serializable: quindi anche il 'this' della classe circostante viene serializzato. Ho riscontrato che "X.questo" è nullo dopo il ricaricamento dell'oggetto, ad esempio. –

+1

In realtà, ho scoperto una differenza -> su Eclipse, se si verifica un arresto anomalo all'interno della classe Anonymous, Eclipse non sa nemmeno quale progetto puntare la linea di arresto (come, ad esempio, si ha un mucchio di thread e runnables come classi anonime) –

Problemi correlati