|
Quando vado in negozio a comprare una radio, posso chiedere una radio di un certo tipo, oppure una radio e basta. Quindi abbiamo due casi distinti, che si può tradurre in programmazione oggetti come la costruzione di un oggetto con costruttori diversi.
  |
Posso concatenare i costruttori |
Il codice dei costruttori tende ad essere molto simile, e quindi a ripetersi. Nella maggior parte dei casi succede che esiste un costruttore molto generale con numerosi parametri, e vari costruttori più semplici, che sono casi particolari di quello più generale. Esiste un meccanismo per ovviare a questo problema, che consiste nella possibilità di concatenare i costruttori. Vediamo un listato.
class Stack {
int top;
int[] stack;
Stack(int n)
{ top=0; stack = new int[n];}
Stack(){ this(10);}
}
  |
this(...)deve essere il primo comando di un costruttore |
Bisogna tenere presente che il costruttore di un oggetto fa due cose: prima alloca la memoria, e poi la inizializza. Per questo motivo non posso semplicemente chiamare un altro costruttore, devo utilizzare un meccanismo speciale che evita l'allocazione di memoria. Questo meccanismo è il this(...). Esiste un altro vincolo importante: il this() deve essere il primo comando di un costruttore.
In pratica nell'esempio vediamo come viene invocato dal costruttore senza argomenti il costruttore con un argomento. Il concetto è che se chiedo uno stack e basta, me ne viene fornito uno con dieci elementi. Eventualmente posso specificare esplicitamente il numero di elementi contenuti.
  |
la chiamata this(...)
è cosa diversa dal puntatore this.campo |
Notare le parentesi dopo il nome. Questo costrutto non ha niente a che vedere con il this usato come variabile. In questa forma è un meccanismo che consente ad un costruttore di far eseguire l'inizializzazione a un altro costruttore, senza che venga di nuovo allocato la memoria.
|