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?
risposta
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).
+1 - sebbene se si intendesse implementare l'inizializzazione lazy (o non pigro differito), probabilmente non si "accadrà" in un costruttore. –
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.
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");
}};
- introduce una nuova classe anonima, un file nel vaso; non così ottimale.
- La seconda forma è una cosa da gioco geek.
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. –
@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. –
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) –
- 1. Come restituire da un blocco di inizializzazione statico in java
- 2. Blocco di inizializzazione statico in Kotlin
- 3. Carica le proprietà java all'interno del blocco di inizializzazione statico
- 4. Java: quando è utile un blocco di inizializzazione statico?
- 5. Quando/Perché dovrei usare Multithread in Java?
- 6. Blocco statico rispetto al metodo statico - inizializzazione dei campi statici
- 7. Inizializzazione del campo statico Java
- 8. perché dovrei usare il servizio Android invece di java thread
- 9. Perché dovrei usare il frammento in Android?
- 10. Blocco statico non elaborato in java
- 11. Perché dovrei usare Drools?
- 12. Perché dovrei usare "const" nel mio blocco catch?
- 13. Blocco statico in Java non eseguito
- 14. Perché dovrei usare glBindAttribLocation?
- 15. Perché dovrei usare gitignore?
- 16. ottenere blocco di inizializzazione statico per l'esecuzione in un Java senza caricare la classe
- 17. Come rendere strictfp un blocco di inizializzazione (statico)?
- 18. Perché non dovremmo usare protetto statico in Java
- 19. Quando dovrei usare package-private in Java?
- 20. Perché dovrei usare il posizionamento nuovo?
- 21. Perché dovrei usare funzioni divergenti?
- 22. Perché non dovrei usare Unity?
- 23. Perché dovrei usare exit select?
- 24. Perché dovrei usare io_service :: work?
- 25. Java: le variabili finali possono essere inizializzate nel blocco di inizializzazione statico?
- 26. Blocco di inizializzazione e inizializzazione selezionato
- 27. Come e dove usare il modificatore statico in Java?
- 28. Perché non si può usare un blocco di inizializzazione per una variabile statica in una classe interna?
- 29. Perché non dovrei usare atoi()?
- 30. Perché dovrei usare Spring Android?
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
e ogni volta che viene chiamato c'tor, i valori statici verranno ripristinati. cattivo!! – Azodious