Newsgroup: it.comp.java
Titolo: Blocco static senza nome fuori dal main()...

Salve a tutti, sono nuovo del NG e da un annetto sono alle prese
con java, "grazie" a dei corsi universitari sulla programmazione
di applicazioni distribuite (reti locali e non) e di applicazioni
che si interfacciano con Database SQL...
Nel codice di tutti gli esempi che ci hanno fornito per
interfacciarci all' IBM DB2 UDB c'è un blocco che non capisco;
non ne ho mai visto uno dichiarato così, e non trovo nulla nei
miei manuali...
class Esempio {
static {
    try {
	// register the driver with DriverManager
	Class.forName("COM.ibm.db2.jdbc.app.DB2Driver").newInstance();
    } catch (Exception e) {
    	e.printStackTrace();
    }
}
public static void main(String argv[]) {
....
etc etc etc etc
Quel blocco "static" dichiarato fuori dal main() non ha un nome, quindi 
non è nè un metodo nè una variabile di classe, e non può quindi essere
invocato esplicitamente nè dal main nè dall'esterno (senza nome come 
faccio !?!?)... giusto ?
L'esecuzione di una appplicazione prevede poi che vengano eseguite le 
istruzioni *nel* main()... giusto ?
E allora a che serve, quando viene eseguito e da chi ?
Grazie...
-- 
----------------------------------------------------------------------------------
       /)/)		La mia vita è tutta rose e fiori...
      (  '.')
   o(_('')('')				... ma io sono allergico !!!

 E allora a che serve, quando viene eseguito e da chi ?
E' un blocco di inizializzazione statico.
E' la prima cosa che viene eseguita quando richiami la classe in qualche 
maniera (in assoluto non c'e' altro codice che possa venire eseguito prima 
di quel blocco statico).
A cosa serve? serve a caricare il driver jdbc *almeno* una volta prima del 
suo utilizzo. 


Sinceramente non sono sicuro sul  "almeno".

 E allora a che serve, quando viene eseguito e da chi ?
Dal classloader automaticamente quando viene caricata la classe.

 Sinceramente non sono sicuro sul  "almeno".
Infatti, viene eseguito una volta soltanto.

 main ha anche un blocco statico (e sottolineo statico, perchè potrebbe
Grazie ad entrambi per le risposte...
Un blocco di quel tipo, non statico, come funzionerebbe invece ?
Dove posso trovare le specifiche di questi
"blocchi di inizializzazione" ? sui miei manuali da niubbo non
c'è nulle di nulla sull'argomento...
-- 
----------------------------------------------------------------------------------
       /)/)		La mia vita è tutta rose e fiori...
      ( '.')
    o(('')('')				... ma io sono allergico !!!

 Dal classloader automaticamente quando viene caricata la classe.
E quando viene caricata? all'inizio del programma, oppure alla prima 
comparsa nel codice della classe?
Cosa succede se due thread concorrenti eseguono il blocco statico?

 Cosa succede se due thread concorrenti eseguono il blocco statico?
I blocchi di inizializzazione statici (static initializer block) vengono
eseguiti *una volta* quando la classe viene inizializzata.
I problemi di concorrenza quindi non si pongono.

 c'è nulle di nulla sull'argomento...
Un libro decente sul linguaggio. Purtroppo non tutti lo sono.

 I problemi di concorrenza quindi non si pongono.
Vediamo se ho capito: se uno volesse utilizare una classe come thread, e 
fosse prevista la possibilità di più istanze della stessa che lavorano in 
contemporanea (
p.es
., una per ogni utente), converrebbe inizializzare il 
driver con static, per evitare che ad ogni nuova istanza della classe fosse 
necessario sprecare risorse per ripetere tale inizializzazione, giusto? 


No non necessariamente.
Ci sono anche altri modi per ottenere questo, e senza l'uso di static.

 necessario sprecare risorse per ripetere tale inizializzazione, giusto? 
L'esempio tipico riportato dai testi è quello del caricamento della
libreria dinamica nel caso in cui la classe faccia riferimento a metodi
nativi.
L'esempio del caricamento del driver jdbc non è il più calzante. Jdbc è
tipicamente una risorsa dinamica che si configura a runtime; oltre al
fatto che, in quel modo, è vero che il driver viene caricato appena la
classe è inizializzata, ma è altrettanto vero che non viene mai caricato
se quella classe non è inizializzata.

 se quella classe non è inizializzata.
nell'esempio che vi ho mostrato il blocco static che inizializza il driver 
jdbc
è nella classe che contiene il main, quindi viene istanziata per forza...
Che implicazioni socio-politiche o morali ci sarebbero nel caricare
il driver NEL main ?
L'unico vantaggio che mi viene in mente è che mettendolo fuori
dal main, questo non viene eseguito per niente in caso di errore,
risparmiando un minimo di risorse...

 risparmiando un minimo di risorse...
Scusa, ma a me vengono in mente almeno 10 soluzioni meno stupide :-) Il
driver si registra da sempre quando si effettua la connessione, anche
tutte le volte perchè tanto viene caricato solo la prima. Per
semplificare si fa un bel metodo che fa insieme la registrazione del
driver e la connessione, e si richiama quello ogni volta che serve.
O altrimenti ci si fa cogliere dall'illuminazione e si usano i
DataSource i quali (guardacaso) stanno lì apposta :-)