|
Dobbiamo affrontare adesso un altro problema: cosa succede alle espressioni di inizializzazione? Stiamo parlando di quelle espressioni che seguono la dichiarazione campi, come nel seguente esempio.
class Stack {
// inizializzazione
int top=0;
int stack;
Stack (int size)
{ stack = new int [size];}
Stack (){ this (10);}
}
  |
Le espressioni di inizializzazione: |
Abbiamo che top=0 è una espressione di inizializzazione. Il concetto
importante da capire è che questa espressioni vengono eseguite
all'atto della costruzione. Ovvero fanno parte del costruttore.
  |
appartengono a tutti i costruttori |
Possiamo dire che l'espressione di inizializzazione appartengono a
tutti i costruttori. Ovvero se vogliamo che un campo abbia un valore
iniziale, lo stesso per tutti i costruttori, definiamo il suo valore
in una espressione di inizializzazione.
  |
vengono eseguite prima del costruttore |
  |
ma dopo l'allocazione |
Queste espressioni vengono eseguite prima del costruttore. In pratica
quando creo un oggetto, per prima cosa viene allocata la memoria, poi
vengono eseguite le espressioni di inizializzazione dei campi e infine
si raggiunge il corpo del costruttore. In rapace qualcos'altro che
avviene prima, lo vedremo più avanti.
  |
non possono contenere comandi |
Ovviamente posso usare questo meccanismo solamente quando posso
inizializzare un campo senza fare troppi calcoli. Queste espressioni
infatti non possono contenere comandi. Se devo fare delle operazioni
prima di ottenere il valore da assegnare, devo spostare l'operazione
nel corpo del costruttore.
  |
non possono sollevare eccezioni |
Un altro problema è che non posso gestire eccezioni. Anche in questo
caso devo spostare le operazioni dentro il corpo di un costruttore.
  |
notare che new int[size], richiedendo un parametro, va posto in un costruttore |
Infine l'ultimo caso, ma non meno importante, è quello che nelle
espressioni di inizializzazione non posso usare il parametri passati
al costruttore. Anche in questo caso devo ricorrere al corpo di un
costruttore. In tutti questi casi, qualora si ripetessero blocchi di
codice comune, devo sfruttare il meccanismo del this() per ridurlo.
|